<?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=Jarekz</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=Jarekz"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php/Specjalna:Wk%C5%82ad/Jarekz"/>
	<updated>2026-05-29T18:23:10Z</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_Sygna%C5%82%C3%B3w_Bioelektrycznych&amp;diff=11823</id>
		<title>Pracownia Sygnałów Bioelektrycznych</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_Sygna%C5%82%C3%B3w_Bioelektrycznych&amp;diff=11823"/>
		<updated>2026-05-27T07:43:00Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Materiały */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Pracownie specjalistyczne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dla NI link do classroom: https://classroom.google.com/c/NjY2MjI3NDU2NDA3?cjc=mvvocie&lt;br /&gt;
&lt;br /&gt;
==Zasady zaliczenia pracowni==&lt;br /&gt;
&lt;br /&gt;
* Obecność na zajęciach jest obowiązkowa, dopuszczalne są 2 nieusprawiedliwione nieobecności.&lt;br /&gt;
&lt;br /&gt;
Materiał zajęć jest podzielony na bloki tematyczne. W każdym bloku studenci mają do wykonania zestaw ćwiczeń. Pod koniec każdego bloku konieczne będzie przesłanie raportu w postaci notebooka na adres jarekz@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
# Prezentacja wyników w notebooku powinna uwzględniać:&lt;br /&gt;
#* przypomnienie, co było liczone (i jak, jeśli trzeba);&lt;br /&gt;
#* na co należy zwrócić uwagę w prezentowanych wynikach;&lt;br /&gt;
#* interpretację wykresów.&amp;lt;br&amp;gt;Część z tych informacji można dołożyć do rysunków w postaci krótkich wyjaśnień.&lt;br /&gt;
# Należy zadbać o prawidłową postać wykresów, w tym w szczególności:&lt;br /&gt;
#* obecność opisów osi (w miarę możliwości jednostek);&lt;br /&gt;
#* spójne zakresy osi i skalowanie wykresów;&lt;br /&gt;
#* właściwy dobór skali (tak, aby uwidocznić najważniejsze rzeczy);&lt;br /&gt;
#* obecność tytułów i innych podpisów ułatwiających zrozumienie prezentowanych treści.&lt;br /&gt;
# Ocenie podlegają:&lt;br /&gt;
#* kompletność prezentacji;&lt;br /&gt;
#* poprawność kodu;&lt;br /&gt;
#* czytelność prezentowanych wielkości i zjawisk;&lt;br /&gt;
#* merytoryczna poprawność wypowiedzi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--# &lt;br /&gt;
# Każdy z powyższych elementów będzie uwzględniony w ocenie prezentacji w 10-punktowej skali. Do wyniku końcowego będą liczyły się punkty z trzech (na cztery) najlepszych prezentacji.&lt;br /&gt;
Każde zajęcia rozpoczynają się od wejściówki, za którą można uzyskać od 0 do 2 punktów.&lt;br /&gt;
# Aby zaliczyć przedmiot trzeba uzyskać połowę punktów za prezentacje. Wszystkie razem zsumowane punkty zadecydują o ocenie końcowej.&lt;br /&gt;
# Wyniki dodatkowe, ponadprogramowe, są mile widziane i mogą skutkować lepszą oceną.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Materiały==&lt;br /&gt;
##  [[Pracownia_Sygnałów_Biologicznych/Zajecia_1|Wprowadzenie]]&lt;br /&gt;
&lt;br /&gt;
[[Pracownia_Sygnałów_Biologicznych/Zajecia_2_4|EKG]] &lt;br /&gt;
## Wstęp teoretyczny i pomiary&lt;br /&gt;
## detekcja pików R i tętno&lt;br /&gt;
## analiza HRV&lt;br /&gt;
przesyłanie notebooków z EKG/HRV do 1.04&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Pracownia_Sygnałów_Biologicznych/Zajecia_5_6|EMG]] (Zaczynamy 25 i 27 marca 2026)&lt;br /&gt;
##  wprowadzenie, pomiary, analiza ćwiczenie I (25 i 27 marca 2026)&lt;br /&gt;
##  analiza ćwiczenie I (8 i 10 kwietnia 2026)&lt;br /&gt;
##  analiza ćwiczenie I (15 i 17 kwietnia 2026)&lt;br /&gt;
##  analiza sygnału online (ćwiczenie V),  analiza ćwiczenie III  (29 i 24 kwietnia)&lt;br /&gt;
## -&amp;gt; przesyłanie notebooków z EMG do 8.05.2026&lt;br /&gt;
##  &lt;br /&gt;
#[[Pracownia_Sygnałów_Biologicznych/Zajecia_7|Spotkanie IX - XI (EOG)]] (Zaczynamy 22 kwietnia i 6 maja 2026)&lt;br /&gt;
##  podstawowe własności EOG - rejestracja 22 IV i 6 V&lt;br /&gt;
##  podstawowe własności EOG - analiza i szykowanie raportów (13, 15, 20, 22 V): zwrot raportów z EOG 06.06&lt;br /&gt;
#[[Pracownia_Sygnałów_Biologicznych/Zajecia_8n|Neurokit - 27 i 29 V]]&lt;br /&gt;
#[[Pracownia_Sygnałów_Biologicznych/Zajecia_8|Spotkanie  (GSR)]]&lt;br /&gt;
#[[Pracownia_Sygnałów_Biologicznych/Zajecia_9|Spotkanie XII - XIV (Wprowadzenie EEG)]]&lt;br /&gt;
##  [[Pracownia_EEG/EEG_spoczynkowe|EEG spoczynkowe, artefakty  ]]&lt;br /&gt;
##  [[Pracownia_Sygnałów_Biologicznych/Zajecia_10|Analiza EEG]]&lt;br /&gt;
## &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Autor: dr hab. Piotr Suffczyński&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11817</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11817"/>
		<updated>2026-05-19T10:33:17Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Zadania do samodzielnej realizacji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt; J \sim e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella.&lt;br /&gt;
&lt;br /&gt;
Mamy dla EEG:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
'''Fizyczna intuicja''' &lt;br /&gt;
&lt;br /&gt;
Wyobraź sobie, że potencjał wytworzony przez dipol na danej elektrodzie zależy od tego, jak silnie ta elektroda „widzi&amp;quot; punkt w mózgu. Twierdzenie Helmholtza mówi: jeśli chcesz wiedzieć, jak silnie elektroda widzi dany punkt — odwróć kierunek. Wstrzyknij prąd przez tę elektrodę i sprawdź, jakie pole powstaje w tym punkcie. Im silniejsze pole tam dotrze, tym czulsza jest elektroda na dipol tam ulokowany. Kierunek pola wskazuje też, na jaką orientację dipola elektroda reaguje najsilniej.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11816</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11816"/>
		<updated>2026-05-19T10:29:24Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Szkielet kodu — fitowanie dipola dla składowej N20 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt; J \sim e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella.&lt;br /&gt;
&lt;br /&gt;
Mamy dla EEG:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
'''Fizyczna intuicja''' &lt;br /&gt;
&lt;br /&gt;
Wyobraź sobie, że potencjał wytworzony przez dipol na danej elektrodzie zależy od tego, jak silnie ta elektroda „widzi&amp;quot; punkt w mózgu. Twierdzenie Helmholtza mówi: jeśli chcesz wiedzieć, jak silnie elektroda widzi dany punkt — odwróć kierunek. Wstrzyknij prąd przez tę elektrodę i sprawdź, jakie pole powstaje w tym punkcie. Im silniejsze pole tam dotrze, tym czulsza jest elektroda na dipol tam ulokowany. Kierunek pola wskazuje też, na jaką orientację dipola elektroda reaguje najsilniej.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11815</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11815"/>
		<updated>2026-05-19T10:28:21Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Krok 1: Model do przodu — BEM dla EEG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt; J \sim e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella.&lt;br /&gt;
&lt;br /&gt;
Mamy dla EEG:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
'''Fizyczna intuicja''' &lt;br /&gt;
&lt;br /&gt;
Wyobraź sobie, że potencjał wytworzony przez dipol na danej elektrodzie zależy od tego, jak silnie ta elektroda „widzi&amp;quot; punkt w mózgu. Twierdzenie Helmholtza mówi: jeśli chcesz wiedzieć, jak silnie elektroda widzi dany punkt — odwróć kierunek. Wstrzyknij prąd przez tę elektrodę i sprawdź, jakie pole powstaje w tym punkcie. Im silniejsze pole tam dotrze, tym czulsza jest elektroda na dipol tam ulokowany. Kierunek pola wskazuje też, na jaką orientację dipola elektroda reaguje najsilniej.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11814</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11814"/>
		<updated>2026-05-14T11:16:35Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Przybliżenie kwazistatyczne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt; J \sim e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella.&lt;br /&gt;
&lt;br /&gt;
Mamy dla EEG:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
'''Fizyczna intuicja''' &lt;br /&gt;
&lt;br /&gt;
Wyobraź sobie, że potencjał wytworzony przez dipol na danej elektrodzie zależy od tego, jak silnie ta elektroda „widzi&amp;quot; punkt w mózgu. Twierdzenie Helmholtza mówi: jeśli chcesz wiedzieć, jak silnie elektroda widzi dany punkt — odwróć kierunek. Wstrzyknij prąd przez tę elektrodę i sprawdź, jakie pole powstaje w tym punkcie. Im silniejsze pole tam dotrze, tym czulsza jest elektroda na dipol tam ulokowany. Kierunek pola wskazuje też, na jaką orientację dipola elektroda reaguje najsilniej.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11813</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11813"/>
		<updated>2026-05-14T11:15:27Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Przybliżenie kwazistatyczne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella.&lt;br /&gt;
&lt;br /&gt;
Mamy dla EEG:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
'''Fizyczna intuicja''' &lt;br /&gt;
&lt;br /&gt;
Wyobraź sobie, że potencjał wytworzony przez dipol na danej elektrodzie zależy od tego, jak silnie ta elektroda „widzi&amp;quot; punkt w mózgu. Twierdzenie Helmholtza mówi: jeśli chcesz wiedzieć, jak silnie elektroda widzi dany punkt — odwróć kierunek. Wstrzyknij prąd przez tę elektrodę i sprawdź, jakie pole powstaje w tym punkcie. Im silniejsze pole tam dotrze, tym czulsza jest elektroda na dipol tam ulokowany. Kierunek pola wskazuje też, na jaką orientację dipola elektroda reaguje najsilniej.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11812</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11812"/>
		<updated>2026-05-14T11:13:30Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 6. Twierdzenie o wzajemności — dlaczego macierz \mathbf{L} da się liczyć rozsądnie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
'''Fizyczna intuicja''' &lt;br /&gt;
&lt;br /&gt;
Wyobraź sobie, że potencjał wytworzony przez dipol na danej elektrodzie zależy od tego, jak silnie ta elektroda „widzi&amp;quot; punkt w mózgu. Twierdzenie Helmholtza mówi: jeśli chcesz wiedzieć, jak silnie elektroda widzi dany punkt — odwróć kierunek. Wstrzyknij prąd przez tę elektrodę i sprawdź, jakie pole powstaje w tym punkcie. Im silniejsze pole tam dotrze, tym czulsza jest elektroda na dipol tam ulokowany. Kierunek pola wskazuje też, na jaką orientację dipola elektroda reaguje najsilniej.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11811</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11811"/>
		<updated>2026-05-14T08:22:48Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 6. Twierdzenie o wzajemności — dlaczego macierz \mathbf{L} da się liczyć rozsądnie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
'''Fizyczna intuicja''' &lt;br /&gt;
&lt;br /&gt;
Wyobraź sobie, że potencjał wytworzony przez dipol na danej elektrodzie zależy od tego, jak silnie ta elektroda „widzi&amp;quot; punkt w mózgu. Twierdzenie Helmholtza mówi: jeśli chcesz wiedzieć, jak silnie elektroda widzi dany punkt — odwróć kierunek. Wstrzyknij prąd przez tę elektrodę i sprawdź, jakie pole powstaje w tym punkcie. Im silniejsze pole tam dotrze, tym czulsza jest elektroda na dipol tam ulokowany. Kierunek pola wskazuje też, na jaką orientację dipola elektroda reaguje najsilniej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Konsekwencja obliczeniowa'''&lt;br /&gt;
&lt;br /&gt;
dla każdej z elektrod raz rozwiązujemy PDE z prądem 1 A i zapisujemy &lt;br /&gt;
$$\mathbf{E}^{(A)}(\mathbf{r})$$&lt;br /&gt;
na całej siatce źródeł. Macierz lead field powstaje przez bezkosztowe ewaluowanie:&lt;br /&gt;
$$L_{A,(s,i)} = E^{(A)}_i(\mathbf{r}_s)$$&lt;br /&gt;
— wiersz to elektroda, kolumna to (pozycja źródła, orientacja).&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11810</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11810"/>
		<updated>2026-05-14T08:22:05Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 6. Twierdzenie o wzajemności — dlaczego macierz \mathbf{L} da się liczyć rozsądnie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
'''Fizyczna intuicja''' &lt;br /&gt;
&lt;br /&gt;
Wyobraź sobie, że potencjał wytworzony przez dipol na danej elektrodzie zależy od tego, jak silnie ta elektroda „widzi&amp;quot; punkt w mózgu. Twierdzenie Helmholtza mówi: jeśli chcesz wiedzieć, jak silnie elektroda widzi dany punkt — odwróć kierunek. Wstrzyknij prąd przez tę elektrodę i sprawdź, jakie pole powstaje w tym punkcie. Im silniejsze pole tam dotrze, tym czulsza jest elektroda na dipol tam ulokowany. Kierunek pola wskazuje też, na jaką orientację dipola elektroda reaguje najsilniej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Konsekwencja obliczeniowa'''&lt;br /&gt;
&lt;br /&gt;
dla każdej z elektrod raz rozwiązujemy PDE z prądem 1 A i zapisujemy &lt;br /&gt;
$$E(A)(r)\mathbf{E}^{(A)}(\mathbf{r})$$&lt;br /&gt;
na całej siatce źródeł. Macierz lead field powstaje przez bezkosztowe ewaluowanie:&lt;br /&gt;
$$L_{A,(s,i)} = E^{(A)}_i(\mathbf{r}_s)$$&lt;br /&gt;
— wiersz to elektroda, kolumna to (pozycja źródła, orientacja).&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11809</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11809"/>
		<updated>2026-05-14T08:21:28Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 6. Twierdzenie o wzajemności — dlaczego macierz \mathbf{L} da się liczyć rozsądnie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
'''Fizyczna intuicja''' &lt;br /&gt;
&lt;br /&gt;
Wyobraź sobie, że potencjał wytworzony przez dipol na danej elektrodzie zależy od tego, jak silnie ta elektroda „widzi&amp;quot; punkt w mózgu. Twierdzenie Helmholtza mówi: jeśli chcesz wiedzieć, jak silnie elektroda widzi dany punkt — odwróć kierunek. Wstrzyknij prąd przez tę elektrodę i sprawdź, jakie pole powstaje w tym punkcie. Im silniejsze pole tam dotrze, tym czulsza jest elektroda na dipol tam ulokowany. Kierunek pola wskazuje też, na jaką orientację dipola elektroda reaguje najsilniej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Konsekwencja obliczeniowa'''&lt;br /&gt;
&lt;br /&gt;
 dla każdej z elektrod raz rozwiązujemy PDE z prądem 1 A i zapisujemy &lt;br /&gt;
$$E(A)(r)\mathbf{E}^{(A)}(\mathbf{r})$$&lt;br /&gt;
 na całej siatce źródeł. Macierz lead field powstaje przez bezkosztowe ewaluowanie:&lt;br /&gt;
$$L_{A,(s,i)} = E^{(A)}_i(\mathbf{r}_s)$$&lt;br /&gt;
— wiersz to elektroda, kolumna to (pozycja źródła, orientacja).&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11808</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11808"/>
		<updated>2026-05-14T08:13:08Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 7. Co więc dosłownie robi `ft_prepare_headmodel` */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11807</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11807"/>
		<updated>2026-05-14T08:12:39Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 7. Co więc dosłownie robi `ft_prepare_headmodel` */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — wstępnie policzony operator dyskretny (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją raz dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze &amp;lt;math&amp;gt;N_\text{el}\times 3&amp;lt;/math&amp;gt; — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11806</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11806"/>
		<updated>2026-05-14T08:10:00Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z &amp;lt;math&amp;gt;\sim 10^4&amp;lt;/math&amp;gt; źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To &amp;lt;math&amp;gt;3\times 10^4&amp;lt;/math&amp;gt; rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; jest równoważny pewnej wielkości policzonej z &lt;br /&gt;
pola elektrycznego wytworzonego w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; przez jednostkowy prąd wstrzyknięty między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{E}^{(A)}&amp;lt;/math&amp;gt; to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast &amp;lt;math&amp;gt;3N_\text{src}&amp;lt;/math&amp;gt; rozwiązań PDE wystarczy &amp;lt;math&amp;gt;N_\text{el}-1&amp;lt;/math&amp;gt; rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11805</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11805"/>
		<updated>2026-05-14T08:07:47Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania ====&lt;br /&gt;
W pakiecie fieldtrip problem wprostt jest rozwiązywany przez funkcję&lt;br /&gt;
`ft_prepare_headmodel` - to fabryka różnych metod rozwiązujących to samo PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;V_\infty&amp;lt;/math&amp;gt; to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{K}&amp;lt;/math&amp;gt; to macierz sztywności zależna od &amp;lt;math&amp;gt;\sigma(\mathbf{r})&amp;lt;/math&amp;gt;, a &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11804</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11804"/>
		<updated>2026-05-14T08:03:13Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 4. Warunki brzegowe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11803</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11803"/>
		<updated>2026-05-14T08:01:29Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11802</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11802"/>
		<updated>2026-05-14T08:00:56Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 3. Model źródła: dipol prądowy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt; o momencie &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; jest **liniową** funkcją &amp;lt;math&amp;gt;\mathbf{q}&amp;lt;/math&amp;gt;. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{v} \in \mathbb{R}^{N_\text{el}}&amp;lt;/math&amp;gt; to potencjały, &amp;lt;math&amp;gt;\mathbf{j} \in \mathbb{R}^{3N_\text{src}}&amp;lt;/math&amp;gt; to momenty dipoli, a &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to *lead field matrix*. Każda kolumna &amp;lt;math&amp;gt;\mathbf{L}&amp;lt;/math&amp;gt; to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11801</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11801"/>
		<updated>2026-05-14T07:59:08Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku &amp;lt;math&amp;gt;\nabla \cdot \mathbf{J}_\text{tot} = 0&amp;lt;/math&amp;gt; dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11800</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11800"/>
		<updated>2026-05-14T07:57:03Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Przybliżenie kwazistatyczne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11799</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11799"/>
		<updated>2026-05-14T07:56:42Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Przybliżenie kwazistatyczne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J}_ &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11798</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11798"/>
		<updated>2026-05-14T07:54:07Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Przybliżenie kwazistatyczne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; z &amp;lt;math&amp;gt;\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/math&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J}_\text{f} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11797</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11797"/>
		<updated>2026-05-14T07:51:47Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Przybliżenie kwazistatyczne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową &amp;lt;math&amp;gt;e^{i\omega t}&amp;lt;/math&amp;gt; i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to &amp;lt;math&amp;gt;\omega\varepsilon/\sigma&amp;lt;/math&amp;gt;. Dla tkanki przy &amp;lt;math&amp;gt;f=100&amp;lt;/math&amp;gt; Hz, &amp;lt;math&amp;gt;\sigma\approx 0{,}3&amp;lt;/math&amp;gt; S/m, &amp;lt;math&amp;gt;\varepsilon_r\approx 10^5&amp;lt;/math&amp;gt; (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać &amp;lt;math&amp;gt;\nabla\times\mathbf{H}\approx\mathbf{J}&amp;lt;/math&amp;gt;, a po wzięciu dywergencji:&lt;br /&gt;
&lt;br /&gt;
$$\nabla\cdot\mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że &amp;lt;math&amp;gt;\partial\mathbf{B}/\partial t&amp;lt;/math&amp;gt; jest na tyle małe, że &amp;lt;math&amp;gt;\nabla\times\mathbf{E}\approx 0&amp;lt;/math&amp;gt;, więc istnieje potencjał skalarny &amp;lt;math&amp;gt;V$ z $\mathbf{E}=-\nabla V&amp;lt;/math&amp;gt;. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od &amp;lt;math&amp;gt;-\nabla V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to &amp;lt;math&amp;gt;\lambda = c/f\approx 3000&amp;lt;/math&amp;gt; km, czyli &amp;lt;math&amp;gt;\lambda \gg L_\text{głowy}&amp;lt;/vmath&amp;gt;. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J}_\text{f} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i &amp;lt;math&amp;gt;\nabla\cdot\mathbf{B}=0&amp;lt;/math&amp;gt; nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z &amp;lt;math&amp;gt;\rho = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)&amp;lt;/math&amp;gt;, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do &amp;lt;math&amp;gt;\mathbf{J}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną (&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; na skórze vs. &amp;lt;math&amp;gt;\mathbf{B}&amp;lt;/math&amp;gt; na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $$\omega\varepsilon$$ jest o kilka rzędów mniejszy od członu omowego $$\sigma$$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11796</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11796"/>
		<updated>2026-05-14T07:46:44Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Pełne równania Maxwella w ośrodku materialnym */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem &amp;lt;math&amp;gt;\mathbf{E}&amp;lt;/math&amp;gt;, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową $e^{i\omega t}$ i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to $\omega\varepsilon/\sigma$. Dla tkanki przy $f=100$ Hz, $\sigma\approx 0{,}3$ S/m, $\varepsilon_r\approx 10^5$ (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z $f$):&lt;br /&gt;
&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać $\nabla\times\mathbf{H}\approx\mathbf{J}_\text{f}$, a po wzięciu dywergencji:&lt;br /&gt;
&lt;br /&gt;
$$\nabla\cdot\mathbf{J}_\text{f} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że $\partial\mathbf{B}/\partial t$ jest na tyle małe, że $\nabla\times\mathbf{E}\approx 0$, więc istnieje potencjał skalarny $V$ z $\mathbf{E}=-\nabla V$. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od $-\nabla V$.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to $\lambda = c/f\approx 3000$ km, czyli $\lambda \gg L_\text{głowy}$. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J}_\text{f} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i $\nabla\cdot\mathbf{B}=0$ nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia $V$ na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z $\rho_\text{f} = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)$, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do $\mathbf{J}_\text{f}$.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną ($V$ na skórze vs. $\mathbf{B}$ na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $$\omega\varepsilon$$ jest o kilka rzędów mniejszy od członu omowego $$\sigma$$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11795</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11795"/>
		<updated>2026-05-14T07:46:15Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Pełne równania Maxwella w ośrodku materialnym */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; &amp;lt;math&amp;gt;\mathbf{J}^p&amp;lt;/math&amp;gt; pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem $\mathbf{E}$, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową $e^{i\omega t}$ i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to $\omega\varepsilon/\sigma$. Dla tkanki przy $f=100$ Hz, $\sigma\approx 0{,}3$ S/m, $\varepsilon_r\approx 10^5$ (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z $f$):&lt;br /&gt;
&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać $\nabla\times\mathbf{H}\approx\mathbf{J}_\text{f}$, a po wzięciu dywergencji:&lt;br /&gt;
&lt;br /&gt;
$$\nabla\cdot\mathbf{J}_\text{f} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że $\partial\mathbf{B}/\partial t$ jest na tyle małe, że $\nabla\times\mathbf{E}\approx 0$, więc istnieje potencjał skalarny $V$ z $\mathbf{E}=-\nabla V$. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od $-\nabla V$.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to $\lambda = c/f\approx 3000$ km, czyli $\lambda \gg L_\text{głowy}$. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J}_\text{f} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i $\nabla\cdot\mathbf{B}=0$ nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia $V$ na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z $\rho_\text{f} = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)$, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do $\mathbf{J}_\text{f}$.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną ($V$ na skórze vs. $\mathbf{B}$ na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $$\omega\varepsilon$$ jest o kilka rzędów mniejszy od członu omowego $$\sigma$$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11794</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11794"/>
		<updated>2026-05-14T07:45:28Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Pełne równania Maxwella w ośrodku materialnym */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;/math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; $\mathbf{J}^p$ pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem $\mathbf{E}$, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową $e^{i\omega t}$ i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to $\omega\varepsilon/\sigma$. Dla tkanki przy $f=100$ Hz, $\sigma\approx 0{,}3$ S/m, $\varepsilon_r\approx 10^5$ (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z $f$):&lt;br /&gt;
&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać $\nabla\times\mathbf{H}\approx\mathbf{J}_\text{f}$, a po wzięciu dywergencji:&lt;br /&gt;
&lt;br /&gt;
$$\nabla\cdot\mathbf{J}_\text{f} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że $\partial\mathbf{B}/\partial t$ jest na tyle małe, że $\nabla\times\mathbf{E}\approx 0$, więc istnieje potencjał skalarny $V$ z $\mathbf{E}=-\nabla V$. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od $-\nabla V$.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to $\lambda = c/f\approx 3000$ km, czyli $\lambda \gg L_\text{głowy}$. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J}_\text{f} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i $\nabla\cdot\mathbf{B}=0$ nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia $V$ na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z $\rho_\text{f} = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)$, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do $\mathbf{J}_\text{f}$.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną ($V$ na skórze vs. $\mathbf{B}$ na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $$\omega\varepsilon$$ jest o kilka rzędów mniejszy od członu omowego $$\sigma$$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11793</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11793"/>
		<updated>2026-05-14T07:45:07Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Pełne równania Maxwella w ośrodku materialnym */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową (&amp;lt;math&amp;gt;\sigma\mathbf{E}&amp;lt;\math&amp;gt;, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; $\mathbf{J}^p$ pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem $\mathbf{E}$, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową $e^{i\omega t}$ i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to $\omega\varepsilon/\sigma$. Dla tkanki przy $f=100$ Hz, $\sigma\approx 0{,}3$ S/m, $\varepsilon_r\approx 10^5$ (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z $f$):&lt;br /&gt;
&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać $\nabla\times\mathbf{H}\approx\mathbf{J}_\text{f}$, a po wzięciu dywergencji:&lt;br /&gt;
&lt;br /&gt;
$$\nabla\cdot\mathbf{J}_\text{f} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że $\partial\mathbf{B}/\partial t$ jest na tyle małe, że $\nabla\times\mathbf{E}\approx 0$, więc istnieje potencjał skalarny $V$ z $\mathbf{E}=-\nabla V$. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od $-\nabla V$.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to $\lambda = c/f\approx 3000$ km, czyli $\lambda \gg L_\text{głowy}$. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J}_\text{f} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i $\nabla\cdot\mathbf{B}=0$ nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia $V$ na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z $\rho_\text{f} = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)$, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do $\mathbf{J}_\text{f}$.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną ($V$ na skórze vs. $\mathbf{B}$ na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $$\omega\varepsilon$$ jest o kilka rzędów mniejszy od członu omowego $$\sigma$$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11792</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11792"/>
		<updated>2026-05-14T07:44:03Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Pełne równania Maxwella w ośrodku materialnym */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową ($\sigma\mathbf{E}$, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; $\mathbf{J}^p$ pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem $\mathbf{E}$, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową $e^{i\omega t}$ i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to $\omega\varepsilon/\sigma$. Dla tkanki przy $f=100$ Hz, $\sigma\approx 0{,}3$ S/m, $\varepsilon_r\approx 10^5$ (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z $f$):&lt;br /&gt;
&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać $\nabla\times\mathbf{H}\approx\mathbf{J}_\text{f}$, a po wzięciu dywergencji:&lt;br /&gt;
&lt;br /&gt;
$$\nabla\cdot\mathbf{J}_\text{f} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że $\partial\mathbf{B}/\partial t$ jest na tyle małe, że $\nabla\times\mathbf{E}\approx 0$, więc istnieje potencjał skalarny $V$ z $\mathbf{E}=-\nabla V$. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od $-\nabla V$.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to $\lambda = c/f\approx 3000$ km, czyli $\lambda \gg L_\text{głowy}$. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J}_\text{f} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i $\nabla\cdot\mathbf{B}=0$ nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia $V$ na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z $\rho_\text{f} = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)$, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do $\mathbf{J}_\text{f}$.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną ($V$ na skórze vs. $\mathbf{B}$ na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $$\omega\varepsilon$$ jest o kilka rzędów mniejszy od członu omowego $$\sigma$$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11791</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11791"/>
		<updated>2026-05-14T07:43:37Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 1. Punkt wyjścia: przybliżenie kwazistatyczne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
=====Pełne równania Maxwella w ośrodku materialnym=====&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \cdot \mathbf{D} &amp;amp;= \rho_\text{f} &amp;amp;&amp;amp; \text{(prawo Gaussa)} \\&lt;br /&gt;
\nabla \cdot \mathbf{B} &amp;amp;= 0 &amp;amp;&amp;amp; \text{(brak monopoli magnetycznych)} \\&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Faradaya)} \\&lt;br /&gt;
\nabla \times \mathbf{H} &amp;amp;= \mathbf{J} + \frac{\partial \mathbf{D}}{\partial t} &amp;amp;&amp;amp; \text{(prawo Ampère'a–Maxwella)}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
uzupełnione związkami konstytutywnymi dla tkanki traktowanej jako liniowy, lokalnie izotropowy ośrodek:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\mathbf{D} = \varepsilon\,\mathbf{E},\qquad \mathbf{B} = \mu_0\,\mathbf{H},\qquad \mathbf{J} = \sigma\,\mathbf{E} + \mathbf{J}^p&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Ostatnia relacja to uogólnione prawo Ohma: prąd swobodny ma część omową ($\sigma\mathbf{E}$, prądy bierne w przewodniku objętościowym) i część „pierwotną&amp;quot; $\mathbf{J}^p$ pochodzącą od źródeł neuronowych — bo to one *nie* są napędzane lokalnym polem $\mathbf{E}$, tylko gradientami stężeń jonów.&lt;br /&gt;
&lt;br /&gt;
===== Przybliżenie kwazistatyczne =====&lt;br /&gt;
&lt;br /&gt;
Wprowadzamy harmoniczną zależność czasową $e^{i\omega t}$ i porównujemy człony w równaniach Maxwella. Trzy warunki muszą być spełnione jednocześnie:&lt;br /&gt;
&lt;br /&gt;
**(a) Pomijalny prąd przesunięcia w równaniu Ampère'a. ** Stosunek członu pojemnościowego do omowego to $\omega\varepsilon/\sigma$. Dla tkanki przy $f=100$ Hz, $\sigma\approx 0{,}3$ S/m, $\varepsilon_r\approx 10^5$ (efektywna wartość niska-częstotliwościowa dla istoty szarej; spada szybko z $f$):&lt;br /&gt;
&lt;br /&gt;
$$\frac{\omega\varepsilon}{\sigma} = \frac{2\pi\cdot 100\cdot 10^5\cdot 8{,}85\cdot 10^{-12}}{0{,}3}\sim 10^{-3}$$&lt;br /&gt;
&lt;br /&gt;
— bezpiecznie pomijalny w EEG. To pozwala napisać $\nabla\times\mathbf{H}\approx\mathbf{J}_\text{f}$, a po wzięciu dywergencji:&lt;br /&gt;
&lt;br /&gt;
$$\nabla\cdot\mathbf{J}_\text{f} = 0$$&lt;br /&gt;
&lt;br /&gt;
**(b) Pomijalna indukcja w równaniu Faradaya.** Mówimy, że $\partial\mathbf{B}/\partial t$ jest na tyle małe, że $\nabla\times\mathbf{E}\approx 0$, więc istnieje potencjał skalarny $V$ z $\mathbf{E}=-\nabla V$. Można to oszacować z indukcyjności geometrii głowy i wykazać, że pomijany wkład jest o kilka rzędów mniejszy od $-\nabla V$.&lt;br /&gt;
&lt;br /&gt;
**(c) Brak efektów propagacyjnych.** Długość fali EM przy 100 Hz w próżni to $\lambda = c/f\approx 3000$ km, czyli $\lambda \gg L_\text{głowy}$. To gwarantuje, że pole „widzi&amp;quot; całą głowę jednocześnie — stąd zerowe przesunięcie fazowe propagacji potencjału przez przewodnik objętościowy.&lt;br /&gt;
&lt;br /&gt;
Co zostaje po przybliżeniu:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
\nabla \times \mathbf{E} &amp;amp;= 0 \;\Rightarrow\; \mathbf{E} = -\nabla V \\&lt;br /&gt;
\nabla \cdot \mathbf{J}_\text{f} &amp;amp;= 0 \\&lt;br /&gt;
\mathbf{J} &amp;amp;= -\sigma\nabla V + \mathbf{J}^p&lt;br /&gt;
\end{aligned}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Składając trzy powyższe:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\nabla\cdot\bigl(\sigma(\mathbf{r})\nabla V(\mathbf{r})\bigr) = \nabla\cdot\mathbf{J}^p(\mathbf{r})&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Warto przy tym podkreślić, że prawo Gaussa i $\nabla\cdot\mathbf{B}=0$ nie znikają — one są nadal spełnione, ale po prostu nie są nam potrzebne do wyliczenia $V$ na skórze: ładunki swobodne i indukowane policzy się *a posteriori* z $\rho_\text{f} = \nabla\cdot(\varepsilon\nabla V)\cdot(-1)$, a pole magnetyczne (interesujące dla MEG!) z prawa Biota–Savarta zastosowanego do $\mathbf{J}_\text{f}$.&lt;br /&gt;
&lt;br /&gt;
Warto tu zauważyć, że kwazistatyka EEG i kwazistatyka MEG to **to samo** przybliżenie — różni je tylko, co wybieramy jako wielkość mierzoną ($V$ na skórze vs. $\mathbf{B}$ na zewnątrz głowy). To samo równanie Poissona generuje oba sygnały, a różnice w czułości na orientację dipola (radialny vs. tangencjalny) wynikają stąd, że potencjał i pole magnetyczne są różnymi funkcjonałami tego samego rozwiązania.&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $$\omega\varepsilon$$ jest o kilka rzędów mniejszy od członu omowego $$\sigma$$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11790</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11790"/>
		<updated>2026-05-14T07:37:42Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 1. Punkt wyjścia: przybliżenie kwazistatyczne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $$\omega\varepsilon$$ jest o kilka rzędów mniejszy od członu omowego $$\sigma$$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11789</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11789"/>
		<updated>2026-05-14T07:30:29Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* 1. Punkt wyjścia: przybliżenie kwazistatyczne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $$\omega\varepsilon$$ jest o kilka rzędów mniejszy od członu omowego $$\sigma$$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}_\text{tot} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11788</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11788"/>
		<updated>2026-05-14T07:29:18Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Skąd bierze się macierz lead field? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
==== 1. Punkt wyjścia: przybliżenie kwazistatyczne ====&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $\omega\varepsilon$ jest o kilka rzędów mniejszy od członu omowego $\sigma$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}_\text{tot} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
==== 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
==== 3. Model źródła: dipol prądowy ====&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
==== 4. Warunki brzegowe ====&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
==== 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
==== 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie ====&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
==== 7. Co więc dosłownie robi `ft_prepare_headmodel` ====&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11787</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11787"/>
		<updated>2026-05-14T07:27:26Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Skąd bierze się macierz lead field? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
## 1. Punkt wyjścia: przybliżenie kwazistatyczne&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $\omega\varepsilon$ jest o kilka rzędów mniejszy od członu omowego $\sigma$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
$$\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}_\text{tot} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment kluczowy: tłumaczy, dlaczego EEG ''czuje'' źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag*.&lt;br /&gt;
&lt;br /&gt;
## 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: &lt;br /&gt;
(a) model źródła, &lt;br /&gt;
(b) warunki brzegowe, &lt;br /&gt;
(c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
## 3. Model źródła: dipol prądowy&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
## 4. Warunki brzegowe&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
## 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel`&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
## 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
## 7. Co więc dosłownie robi `ft_prepare_headmodel`&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11786</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11786"/>
		<updated>2026-05-14T07:25:15Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Model do przodu (forward model) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel: &lt;br /&gt;
** https://labeling.ucsd.edu/tutorial/overview&lt;br /&gt;
** https://github.com/sccn/ICLabel&lt;br /&gt;
&lt;br /&gt;
* MARA: &lt;br /&gt;
** https://github.com/irenne/MARA/raw/master/MARAtutorial.pdf&lt;br /&gt;
** https://irenne.github.io/artifacts/&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
=== Skąd bierze się macierz ''lead field''? ===&lt;br /&gt;
&lt;br /&gt;
Przejdźmy od równań Maxwella do tego, co dosłownie liczą funkcje `ft_prepare_headmodel` / `ft_prepare_leadfield`.&lt;br /&gt;
&lt;br /&gt;
## 1. Punkt wyjścia: przybliżenie kwazistatyczne&lt;br /&gt;
&lt;br /&gt;
W zakresie częstotliwości EEG (powiedzmy &amp;lt; 100 Hz) i przy rozmiarach głowy długości fali EM są ogromne, a człon prądu przesunięcia $\omega\varepsilon$ jest o kilka rzędów mniejszy od członu omowego $\sigma$. Możemy więc z równań Maxwella odrzucić zależności czasowe pola i napisać:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla \times \mathbf{E} = 0 \;\Rightarrow\; \mathbf{E} = -\nabla V&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}_\text{tot} = 0$$&lt;br /&gt;
&lt;br /&gt;
To jest moment dydaktycznie kluczowy: tłumaczy, dlaczego EEG czuje źródło natychmiastowo i dlaczego cała propagacja jest *zero-phase-lag* (przy okazji uzasadnia obserwację z hyperscanningu, że artefakty mrugnięć propagują się synchronicznie).&lt;br /&gt;
&lt;br /&gt;
## 2. Rozszczepienie prądu — gdzie pojawia się „źródło&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Gęstość prądu w tkance dzielimy na część „pierwotną&amp;quot; (neuronową) i „objętościową&amp;quot; (omową):&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}_\text{tot}(\mathbf{r}) = \mathbf{J}^p(\mathbf{r}) - \sigma(\mathbf{r})\,\nabla V(\mathbf{r})$$&lt;br /&gt;
&lt;br /&gt;
$\mathbf{J}^p$ reprezentuje *prądy postsynaptyczne w piramidowych neuronach kory* — to one są naszym „źródłem&amp;quot;. Reszta to prądy bierne płynące w przewodniku objętościowym o nieizotropowej, niejednorodnej przewodności $\sigma$.&lt;br /&gt;
&lt;br /&gt;
Podstawiając do warunku $\nabla \cdot \mathbf{J}_\text{tot} = 0$ dostajemy równanie Poissona dla niejednorodnego przewodnika:&lt;br /&gt;
&lt;br /&gt;
$$\boxed{\;\nabla \cdot \bigl(\sigma(\mathbf{r})\,\nabla V(\mathbf{r})\bigr) = \nabla \cdot \mathbf{J}^p(\mathbf{r})\;}$$&lt;br /&gt;
&lt;br /&gt;
To jest **całe** równanie problemu wprost. Cała reszta to: (a) model źródła, (b) warunki brzegowe, (c) sposób rozwiązania.&lt;br /&gt;
&lt;br /&gt;
## 3. Model źródła: dipol prądowy&lt;br /&gt;
&lt;br /&gt;
Dla pojedynczego dipola w $\mathbf{r}_0$ o momencie $\mathbf{q}$:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{J}^p(\mathbf{r}) = \mathbf{q}\,\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
$$\nabla \cdot \mathbf{J}^p(\mathbf{r}) = \mathbf{q}\cdot\nabla\delta(\mathbf{r}-\mathbf{r}_0)$$&lt;br /&gt;
&lt;br /&gt;
Liniowość PDE daje natychmiast kluczową własność: $V$ jest **liniową** funkcją $\mathbf{q}$. To właśnie ta liniowość pozwala zapisać:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{v} = \mathbf{L}\,\mathbf{j}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{v} \in \mathbb{R}^{N_\text{el}}$ to potencjały, $\mathbf{j} \in \mathbb{R}^{3N_\text{src}}$ to momenty dipoli, a $\mathbf{L}$ to *lead field matrix*. Każda kolumna $\mathbf{L}$ to potencjał wywołany jednostkowym dipolem w danym miejscu i o danej orientacji.&lt;br /&gt;
&lt;br /&gt;
## 4. Warunki brzegowe&lt;br /&gt;
&lt;br /&gt;
Na granicy skóra/powietrze prąd nie wypływa:&lt;br /&gt;
&lt;br /&gt;
$$\sigma\,\nabla V \cdot \hat{\mathbf{n}} = 0 \quad \text{na zewnętrznej powierzchni}$$&lt;br /&gt;
&lt;br /&gt;
Wewnątrz, na granicach tkanek o różnym $\sigma$ (mózg–CSF–czaszka–skóra):&lt;br /&gt;
&lt;br /&gt;
$$V \text{ ciągłe},\quad \sigma\nabla V \cdot \hat{\mathbf{n}} \text{ ciągłe}$$&lt;br /&gt;
&lt;br /&gt;
To są te warunki, które „włączają&amp;quot; geometrię i przewodności do problemu — i to one decydują, że czaszka (niskie $\sigma$, około 1/15–1/80 tkanki miękkiej, do dziś dyskutowane) rozmywa pole tak agresywnie.&lt;br /&gt;
&lt;br /&gt;
## 5. Metody rozwiązania — co siedzi w `ft_prepare_headmodel`&lt;br /&gt;
&lt;br /&gt;
`ft_prepare_headmodel` to fabryka różnych operatorów rozwiązujących tę samą PDE. Wybór `cfg.method` decyduje o paradygmacie matematycznym:&lt;br /&gt;
&lt;br /&gt;
**(a) Rozwiązania analityczne — modele sferyczne** (`'singlesphere'`, `'concentricspheres'`)&lt;br /&gt;
&lt;br /&gt;
Dla geometrii sferycznej z osiową symetrią rozwija się $V$ w szereg wielomianów Legendre'a. Dla 3-warstwowego modelu koncentrycznego dostajemy zamknięty wzór z nieskończonym szeregiem, który w praktyce tnie się po ~40 wyrazach. Berg &amp;amp; Scherg (1994) dali znakomite przybliżenie 3 dipolami w sferze jednorodnej — błyskawicznie szybkie, do dziś używane w MEG. Plus: bardzo szybkie, brak siatkowania. Minus: kula to nie głowa, zwłaszcza w okolicach skroniowych i podstawy.&lt;br /&gt;
&lt;br /&gt;
**(b) BEM — Boundary Element Method** (`'bemcp'`, `'dipoli'`, `'openmeeg'`)&lt;br /&gt;
&lt;br /&gt;
Wykorzystuje się fakt, że w obszarze o stałym $\sigma$ $V$ spełnia równanie Laplace'a, a cały „nietrywialny&amp;quot; wkład można wyrazić jako całkę po powierzchniach granicznych. Z drugiej tożsamości Greena dostajemy całkowe równanie typu Fredholma 2-go rodzaju:&lt;br /&gt;
&lt;br /&gt;
$$V(\mathbf{r}) = V_\infty(\mathbf{r}) + \frac{1}{4\pi}\sum_k \frac{\sigma_k^- - \sigma_k^+}{\bar{\sigma}}\oint_{S_k} V(\mathbf{r}')\,\frac{(\mathbf{r}-\mathbf{r}')\cdot\hat{\mathbf{n}}'}{|\mathbf{r}-\mathbf{r}'|^3}\,dS'$$&lt;br /&gt;
&lt;br /&gt;
gdzie $V_\infty$ to potencjał dipola w przestrzeni nieograniczonej. Triangulujemy powierzchnie (skóra, czaszka, mózg — czasem CSF) i to równanie zamienia się w układ liniowy. Szybciej niż FEM, ale wymaga założenia odcinkowo stałej przewodności i zakłada izotropię.&lt;br /&gt;
&lt;br /&gt;
**(c) FEM — Finite Element Method** (`'simbio'`, `'duneuro'`)&lt;br /&gt;
&lt;br /&gt;
Cała objętość głowy dyskretyzowana czworościanami/sześciościanami z indywidualnym tensorem $\sigma$ w każdym elemencie (z DTI można wstrzyknąć anizotropię istoty białej!). Sformułowanie wariacyjne daje rzadki układ:&lt;br /&gt;
&lt;br /&gt;
$$\mathbf{K}\mathbf{u} = \mathbf{b}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{K}$ to macierz sztywności zależna od $\sigma(\mathbf{r})$, a $\mathbf{b}$ niesie informację o źródle. To „złoty standard&amp;quot; pod kątem dokładności, ale kosztowny — dlatego praktycznie zawsze łączony z trikiem z punktu 6.&lt;br /&gt;
&lt;br /&gt;
**(d) FDM** — rzadziej, dziś głównie historycznie.&lt;br /&gt;
&lt;br /&gt;
## 6. Twierdzenie o wzajemności — dlaczego macierz $\mathbf{L}$ da się liczyć rozsądnie&lt;br /&gt;
&lt;br /&gt;
Naiwne podejście: dla każdego z $\sim 10^4$ źródeł i każdej z 3 orientacji odpalić rozwiązywacz PDE. To $3\times 10^4$ rozwiązań. Beznadzieja.&lt;br /&gt;
&lt;br /&gt;
Helmholtzowska zasada wzajemności mówi: potencjał w elektrodzie A wywołany dipolem w punkcie $\mathbf{r}_0$ jest równoważny pewnej wielkości policzonej z **pola elektrycznego** wytworzonego w $\mathbf{r}_0$ przez **jednostkowy prąd wstrzyknięty** między elektrodą A a referencją. Formalnie:&lt;br /&gt;
&lt;br /&gt;
$$V_A(\mathbf{r}_0;\mathbf{q}) = \mathbf{E}^{(A)}(\mathbf{r}_0)\cdot\mathbf{q}$$&lt;br /&gt;
&lt;br /&gt;
gdzie $\mathbf{E}^{(A)}$ to pole „wstrzykniętego&amp;quot; prądu jednostkowego. Konsekwencja: zamiast $3N_\text{src}$ rozwiązań PDE wystarczy $N_\text{el}-1$ rozwiązań (po jednym na elektrodę). Praktycznie wszystkie pakiety BEM/FEM (w tym OpenMEEG, SimBio, DUNEuro) to wykorzystują — i dlatego FEM jest w ogóle wykonalny dla całych siatek źródłowych.&lt;br /&gt;
&lt;br /&gt;
## 7. Co więc dosłownie robi `ft_prepare_headmodel`&lt;br /&gt;
&lt;br /&gt;
Tworzy obiekt `headmodel`, który zawiera:&lt;br /&gt;
- geometrię (kule albo siatki powierzchniowe, albo objętościową siatkę FEM),&lt;br /&gt;
- przewodności poszczególnych warstw,&lt;br /&gt;
- a w przypadku BEM/FEM — **wstępnie policzony operator dyskretny** (np. odwróconą macierz BEM albo czynnik macierzy sztywności FEM z trikiem transferowym wykorzystującym wzajemność).&lt;br /&gt;
&lt;br /&gt;
To jest najdroższa część obliczeń — i robi się ją *raz* dla danej geometrii. Potem `ft_prepare_leadfield`, dla każdej pozycji źródła w `cfg.sourcemodel`, używa tego operatora, żeby wygenerować trzy kolumny $\mathbf{L}$ (dla orientacji x, y, z). Wynik to `leadfield{i}` o wymiarze $N_\text{el}\times 3$ — czyli dosłownie blok macierzy lead field dla danego wokselu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Podsumowanie:&lt;br /&gt;
&lt;br /&gt;
1. Maxwell → kwazistatyka → „elektrostatyka z prądami&amp;quot;&lt;br /&gt;
2. Podział prądu i równanie Poissona (jedyne równanie, którego naprawdę trzeba)&lt;br /&gt;
3. Dipol jako model i wynikająca **liniowość** → uzasadnienie wzoru $\mathbf{v}=\mathbf{L}\mathbf{j}$&lt;br /&gt;
4. Warunki brzegowe → tu wchodzi anatomia&lt;br /&gt;
5. Sfery (analityczne, intuicja) → BEM → FEM jako kolejne stopnie realizmu&lt;br /&gt;
6. Wzajemność jako trik obliczeniowy, bez którego niczego by się nie dało policzyć w sensownym czasie&lt;br /&gt;
&lt;br /&gt;
Klasyczne źródła:&lt;br /&gt;
- Hallez et al. 2007 *J Neuroeng Rehabil* (review obliczeń forward, bardzo czytelny), &lt;br /&gt;
- Mosher et al. 1999 dla zwartego wyprowadzenia, &lt;br /&gt;
- oraz dokumentacja OpenMEEG (Gramfort et al. 2010) — tam ścieżka BEM jest wyprowadzona z drugiej tożsamości Greena.&lt;br /&gt;
---&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
=== Programy obliczające model do przodu:===&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11783</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11783"/>
		<updated>2026-04-30T09:02:59Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Plan zajęć */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11782</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11782"/>
		<updated>2026-04-30T09:01:55Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Sesja 7: Problem odwrotny w EEG i MEG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11781</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11781"/>
		<updated>2026-04-30T09:01:02Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Sesja 5: ICA — teoria i wydobywanie interesującego komponentu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA jako filtr przestrzenny =&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE: Wydobywanie interesujących komponentów ==&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ZADANIE: Identyfikacja artefaktów ==&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11780</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11780"/>
		<updated>2026-04-30T08:58:39Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Sesja 5: ICA — teoria i wydobywanie interesującego komponentu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11779</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11779"/>
		<updated>2026-04-30T08:57:32Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Sesja 6: ICA — artefakty i synteza metod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11778</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11778"/>
		<updated>2026-04-27T13:49:11Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Instalacja FieldTrip */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Instalacja FieldTrip: Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxa: Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB: Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB: Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji: Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11777</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11777"/>
		<updated>2026-04-27T13:47:37Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Sesja 7: Problem odwrotny — część praktyczna */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Instalacja FieldTrip==&lt;br /&gt;
&lt;br /&gt;
;Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxu:&lt;br /&gt;
&lt;br /&gt;
Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB:&lt;br /&gt;
&lt;br /&gt;
Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga krytyczna — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB:&lt;br /&gt;
Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji:&lt;br /&gt;
&lt;br /&gt;
Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11776</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11776"/>
		<updated>2026-04-27T13:46:33Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Instalacja FieldTrip */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11775</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11775"/>
		<updated>2026-04-27T13:45:28Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Instalacja FieldTrip */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
==Instalacja FieldTrip==&lt;br /&gt;
&lt;br /&gt;
;Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
;Pobranie toolboxu:&lt;br /&gt;
&lt;br /&gt;
Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
;Konfiguracja ścieżki MATLAB:&lt;br /&gt;
&lt;br /&gt;
Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga krytyczna — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
;Trwała konfiguracja przez startup.m:&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB:&lt;br /&gt;
Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
;Weryfikacja instalacji:&lt;br /&gt;
&lt;br /&gt;
Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11774</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11774"/>
		<updated>2026-04-27T13:43:31Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Weryfikacja instalacji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
==Instalacja FieldTrip==&lt;br /&gt;
&lt;br /&gt;
;Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
===Pobranie toolboxu===&lt;br /&gt;
&lt;br /&gt;
Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
===Konfiguracja ścieżki MATLAB===&lt;br /&gt;
&lt;br /&gt;
Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga krytyczna — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
===Trwała konfiguracja przez startup.m===&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB:&lt;br /&gt;
Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
===Weryfikacja instalacji===&lt;br /&gt;
&lt;br /&gt;
Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny — część praktyczna=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~30 min wprowadzenie + ~120 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Część praktyczna prowadzi przez pełny pipeline lokalizacji źródeł:&lt;br /&gt;
od wczytania danych w FieldTrip, przez zbudowanie modelu do przodu,&lt;br /&gt;
do fitowania dipola i interpretacji wyniku.&lt;br /&gt;
Sesja jest zaprojektowana tak, aby każdy krok bezpośrednio ilustrował&lt;br /&gt;
jeden element teorii omówionej w [[#Sesja 7: Problem odwrotny w EEG i MEG|części wykładowej]].&lt;br /&gt;
&lt;br /&gt;
;Dane:&lt;br /&gt;
Używamy standardowego zestawu danych FieldTrip&lt;br /&gt;
(dane somatosensoryczne MEG/EEG, bodziec elektryczny na nadgarstku — składowa N20):&lt;br /&gt;
* https://download.fieldtriptoolbox.org/tutorial/Subject01.zip (~800 MB)&lt;br /&gt;
&lt;br /&gt;
Ten sam zestaw danych jest używany we wszystkich tutorialach FieldTrip&lt;br /&gt;
wymienionych w tej sesji, co ułatwia porównywanie wyników między krokami.&lt;br /&gt;
&lt;br /&gt;
==Krok 0: Wejście do FieldTrip==&lt;br /&gt;
&lt;br /&gt;
Przed właściwym ćwiczeniem proszę zapoznać się z tutorialem wprowadzającym:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/intro/introduction/ Introduction to the FieldTrip toolbox]&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę przechodząc ten tutorial:&lt;br /&gt;
&lt;br /&gt;
Studenci znający EEGLAB natkną się na dwie zasadnicze różnice w filozofii pracy:&lt;br /&gt;
&lt;br /&gt;
* '''Struktura cfg''' zamiast GUI. Każda funkcja FieldTrip przyjmuje strukturę konfiguracyjną &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; i zwraca nową strukturę danych. Nie ma okien dialogowych — cała analiza jest skryptem. Jest to bliższe temu, co robiliśmy w MATLAB-owych sesjach CSP/ICA.&lt;br /&gt;
&lt;br /&gt;
* '''Niezmienność danych'''. FieldTrip nie modyfikuje struktur w miejscu — każde wywołanie funkcji zwraca nową strukturę. Pozwala to łatwo porównywać wyniki różnych parametrów, ale wymaga dbałości o nazewnictwo zmiennych.&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji po lekturze:&lt;br /&gt;
Jak odpowiadają sobie nawzajem: &amp;lt;code&amp;gt;EEG.data&amp;lt;/code&amp;gt; w EEGLAB i struktura &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; w FieldTrip?&lt;br /&gt;
Gdzie w strukturach FieldTrip przechowywane są informacje o lokalizacji elektrod?&lt;br /&gt;
&lt;br /&gt;
==Krok 1: Model do przodu — BEM dla EEG==&lt;br /&gt;
&lt;br /&gt;
Przed fitowaniem dipola musimy obliczyć macierz pola wiodącego &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/headmodel_eeg_bem Construct a BEM headmodel for EEG source analysis]&lt;br /&gt;
&lt;br /&gt;
;Cel tego kroku:&lt;br /&gt;
Zrozumieć skąd pochodzi kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
używana we wszystkich metodach Sesji 7.&lt;br /&gt;
Każda kolumna &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt; mówi: „jeśli w miejscu &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
znajdowałby się dipol o jednostkowym momencie,&lt;br /&gt;
to jakie potencjały zmierzylibyśmy na każdej z elektrod?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Kluczowe funkcje FieldTrip w tym kroku:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Segmentacja MRI na trzy tkanki (skóra, czaszka, mózg)&lt;br /&gt;
cfg           = [];&lt;br /&gt;
cfg.output    = {'brain','skull','scalp'};&lt;br /&gt;
segmentedmri  = ft_volumesegment(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
% Budowanie siatki trójkątów BEM&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.tissue      = {'brain','skull','scalp'};&lt;br /&gt;
cfg.numvertices = [3000 2000 1000];&lt;br /&gt;
bnd             = ft_prepare_mesh(cfg, segmentedmri);&lt;br /&gt;
&lt;br /&gt;
% Obliczenie modelu do przodu metodą BEM (OpenMEEG)&lt;br /&gt;
cfg              = [];&lt;br /&gt;
cfg.method       = 'openmeeg';&lt;br /&gt;
cfg.conductivity = [0.33 0.0041 0.33];   % mózg, czaszka, skóra [S/m]&lt;br /&gt;
headmodel        = ft_prepare_headmodel(cfg, bnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Na co zwrócić uwagę:&lt;br /&gt;
* Stosunek przewodności czaszka/mózg wynosi tu ~1/80.&lt;br /&gt;
  Jak myślisz, jak bardzo błąd w tym parametrze wpłynie na lokalizację źródeł?&lt;br /&gt;
* Funkcja &amp;lt;code&amp;gt;ft_prepare_mesh&amp;lt;/code&amp;gt; tworzy trzy zagnieżdżone siatki.&lt;br /&gt;
  Jak ma się to do opisu BEM z wykładu?&lt;br /&gt;
&lt;br /&gt;
==Krok 2: Fitowanie dipola (ćwiczenie główne)==&lt;br /&gt;
&lt;br /&gt;
;Czas: ~90 min&lt;br /&gt;
&lt;br /&gt;
To jest główne ćwiczenie praktyczne Sesji 7.&lt;br /&gt;
Proszę przejść tutorial:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/dipolefitting Dipole fitting of combined MEG/EEG data]&lt;br /&gt;
&lt;br /&gt;
Poniżej znajdziesz szkielet kodu z pytaniami pomocniczymi&lt;br /&gt;
do samodzielnego wypełnienia — zacznij od tutorialu,&lt;br /&gt;
a potem wróć do szkieletu i uzupełnij brakujące fragmenty.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu — fitowanie dipola dla składowej N20===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK A: Wczytanie i preprocessing danych EEG&lt;br /&gt;
% Dane: Subject01.zip (patrz wyżej)&lt;br /&gt;
% Używamy tylko kanałów EEG, odrzucamy MEG.&lt;br /&gt;
&lt;br /&gt;
cfg                    = [];&lt;br /&gt;
cfg.dataset            = 'Subject01.ds';&lt;br /&gt;
cfg.trialdef.eventtype = 'backpanel trigger';&lt;br /&gt;
cfg.trialdef.eventvalue = 3;           % bodziec na lewym nadgarstku&lt;br /&gt;
cfg.trialdef.prestim   = 0.1;&lt;br /&gt;
cfg.trialdef.poststim  = 0.3;&lt;br /&gt;
cfg                    = ft_definetrial(cfg);&lt;br /&gt;
&lt;br /&gt;
cfg.channel            = 'EEG';&lt;br /&gt;
cfg.continuous         = 'yes';&lt;br /&gt;
cfg.demean             = 'yes';&lt;br /&gt;
cfg.baselinewindow     = [-0.1 0];&lt;br /&gt;
data                   = ft_preprocessing(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK B: Uśrednianie — potencjał wywołany&lt;br /&gt;
% TUTAJ: użyj ft_timelockanalysis aby obliczyć ERP (średnią po powtórzeniach)&lt;br /&gt;
% Wynik zapisz jako 'timelock'&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK C: Wczytanie modelu do przodu i lokalizacji elektrod&lt;br /&gt;
% Zakładamy, że headmodel i elec zostały obliczone w Kroku 1.&lt;br /&gt;
% Jeśli nie — można użyć gotowego modelu z paczki danych Subject01.&lt;br /&gt;
&lt;br /&gt;
load('standard_bem.mat');          % headmodel&lt;br /&gt;
load('Subject01_elec.mat');        % lokalizacje elektrod (po dopasowaniu do MRI)&lt;br /&gt;
&lt;br /&gt;
%% KROK D: Przygotowanie siatki poszukiwań (grid)&lt;br /&gt;
% Definiujemy siatkę regularną 1 cm wewnątrz mózgu.&lt;br /&gt;
% ft_prepare_sourcemodel oblicza też macierz pola wiodącego A&lt;br /&gt;
% (tzw. leadfield) dla każdego punktu siatki.&lt;br /&gt;
&lt;br /&gt;
cfg                 = [];&lt;br /&gt;
cfg.headmodel       = headmodel;&lt;br /&gt;
cfg.elec            = elec;&lt;br /&gt;
cfg.resolution      = 1;           % odstęp siatki w cm&lt;br /&gt;
cfg.unit            = 'cm';&lt;br /&gt;
sourcemodel         = ft_prepare_sourcemodel(cfg);&lt;br /&gt;
&lt;br /&gt;
%% KROK E: Fitowanie dipola&lt;br /&gt;
% Szukamy jednego dipola najlepiej wyjaśniającego topografię N20.&lt;br /&gt;
% Okno czasowe 0.016–0.022 s odpowiada składowej N20.&lt;br /&gt;
&lt;br /&gt;
cfg             = [];&lt;br /&gt;
cfg.latency     = [0.016 0.022];   % okno N20 w sekundach&lt;br /&gt;
cfg.numdipoles  = 1;&lt;br /&gt;
cfg.headmodel   = headmodel;&lt;br /&gt;
cfg.elec        = elec;&lt;br /&gt;
cfg.sourcemodel = sourcemodel;&lt;br /&gt;
cfg.nonlinear   = 'yes';           % optymalizacja nieliniowa po przestrzeni&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: source = ft_dipolefitting(cfg, timelock);&lt;br /&gt;
&lt;br /&gt;
%% KROK F: Wizualizacja wyniku&lt;br /&gt;
% Nałożenie lokalizacji dipola na MRI anatomiczne.&lt;br /&gt;
&lt;br /&gt;
load('standard_mri.mat');          % MRI w tym samym układzie współrzędnych&lt;br /&gt;
&lt;br /&gt;
cfg               = [];&lt;br /&gt;
cfg.location      = source.dip.pos;   % współrzędne znalezionego dipola [x y z]&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: ft_sourceplot(cfg, mri);&lt;br /&gt;
&lt;br /&gt;
%% KROK G: Ocena dopasowania&lt;br /&gt;
% Goodness of fit (GoF) mówi jaka część wariancji danych&lt;br /&gt;
% jest wyjaśniona przez znaleziony dipol.&lt;br /&gt;
% Wartość &amp;gt; 0.85 uznaje się za dobre dopasowanie.&lt;br /&gt;
&lt;br /&gt;
fprintf('Goodness of fit: %.1f%%\n', source.dip.rv * 100);&lt;br /&gt;
% Uwaga: w FieldTrip rv to residual variance (1 - GoF).&lt;br /&gt;
% Dobry dipol ma rv &amp;lt; 0.15.&lt;br /&gt;
&lt;br /&gt;
disp('Lokalizacja dipola [x y z] w mm:')&lt;br /&gt;
disp(source.dip.pos)&lt;br /&gt;
&lt;br /&gt;
disp('Moment dipolowy [qx qy qz]:')&lt;br /&gt;
disp(source.dip.mom)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadania do samodzielnej realizacji===&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Pipeline i lokalizacja&lt;br /&gt;
Uzupełnij brakujące fragmenty szkieletu (kroki B i E–F).&lt;br /&gt;
Gdzie na MRI ląduje znaleziony dipol? Czy odpowiada to oczekiwanej anatomii&lt;br /&gt;
składowej N20 (pierwotna kora somatosensoryczna S1, okolica bruzdy centralnej)?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Wpływ okna czasowego&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.latency&amp;lt;/code&amp;gt; kolejno na:&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.016 0.022]&amp;lt;/code&amp;gt; — okno N20&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.025 0.035]&amp;lt;/code&amp;gt; — okno P25&lt;br /&gt;
* &amp;lt;code&amp;gt;[0.045 0.060]&amp;lt;/code&amp;gt; — okno N45&lt;br /&gt;
Czy lokalizacja dipola zmienia się między tymi składowymi?&lt;br /&gt;
Jak zmienia się GoF? Co to mówi o tym, która składowa jest lepiej opisana modelem jednego dipola?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Dwa dipole&lt;br /&gt;
Zmień &amp;lt;code&amp;gt;cfg.numdipoles = 2&amp;lt;/code&amp;gt; i powtórz fitowanie dla okna N20.&lt;br /&gt;
Czy model dwóch dipoli daje istotnie lepszy GoF niż jeden?&lt;br /&gt;
Jak interpretujesz dwa znalezione źródła?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wrażliwość na model do przodu&lt;br /&gt;
FieldTrip pozwala użyć uproszczonego modelu sferycznego&lt;br /&gt;
zamiast BEM: ustaw &amp;lt;code&amp;gt;cfg.headmodel&amp;lt;/code&amp;gt; na model jednorodnej sfery&lt;br /&gt;
(&amp;lt;code&amp;gt;cfg.method = 'singlesphere'&amp;lt;/code&amp;gt; w &amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;).&lt;br /&gt;
O ile zmienia się lokalizacja dipola N20?&lt;br /&gt;
Czy GoF wzrasta czy maleje?&lt;br /&gt;
&lt;br /&gt;
;Pytania do dyskusji:&lt;br /&gt;
* Fitowanie dipola wymaga podania okna czasowego — dlaczego?&lt;br /&gt;
  Co stałoby się gdybyśmy dopasowywali dipol do całej epoki (−100 do +300 ms)?&lt;br /&gt;
* Algorytm minimalizacji może utknąć w minimum lokalnym.&lt;br /&gt;
  Jak &amp;lt;code&amp;gt;cfg.sourcemodel&amp;lt;/code&amp;gt; (siatka) pomaga temu zaradzić?&lt;br /&gt;
  Jaki jest kompromis między rozdzielczością siatki a czasem obliczeń?&lt;br /&gt;
* Porównaj mapę topograficzną ERP w oknie N20&lt;br /&gt;
  z mapą rekonstruowaną z dopasowanego dipola (wywołaj &amp;lt;code&amp;gt;ft_dipolefitting&amp;lt;/code&amp;gt;&lt;br /&gt;
  z opcją &amp;lt;code&amp;gt;cfg.dipfit.display = 'yes'&amp;lt;/code&amp;gt;).&lt;br /&gt;
  Czy widzisz różnicę? Skąd ona pochodzi?&lt;br /&gt;
&lt;br /&gt;
==Krok 3: Dalsze metody — dla zainteresowanych==&lt;br /&gt;
&lt;br /&gt;
Poniższe tutoriale stanowią naturalne rozwinięcie ćwiczenia głównego&lt;br /&gt;
i ilustrują pozostałe metody omówione w teorii Sesji 7.&lt;br /&gt;
Nie są wymagane na zaliczenie, ale gorąco je polecamy&lt;br /&gt;
jeśli planujesz używać lokalizacji źródeł w pracy badawczej.&lt;br /&gt;
&lt;br /&gt;
;Minimum Norm Estimation:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/minimumnormestimate Source reconstruction of event-related fields using minimum-norm estimation]&lt;br /&gt;
&lt;br /&gt;
Ten sam sygnał N20 co w ćwiczeniu głównym, ale zamiast jednego dipola&lt;br /&gt;
otrzymujesz ciągłą mapę aktywności na całej powierzchni kory.&lt;br /&gt;
Zwróć uwagę jak wybór parametru regularyzacji &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
wpływa na rozmycie rozwiązania.&lt;br /&gt;
Porównaj lokalizację maksimum mapy MNE z lokalizacją dipola z Kroku 2.&lt;br /&gt;
&lt;br /&gt;
;Beamformer (LCMV/DICS):&lt;br /&gt;
[https://www.fieldtriptoolbox.org/tutorial/source/beamformer Localizing oscillatory sources in MEG data using a beamformer]&lt;br /&gt;
&lt;br /&gt;
Tutorial wykorzystuje ten sam zestaw danych Subject01&lt;br /&gt;
i lokalizuje źródła oscylacji gamma wywołanych bodźcem —&lt;br /&gt;
bezpośrednie rozwinięcie analizy ERD/ERS, którą już znasz.&lt;br /&gt;
Kluczowa różnica w stosunku do MNE: beamformer korzysta&lt;br /&gt;
z macierzy kowariancji danych &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt;,&lt;br /&gt;
a nie tylko z modelu do przodu. Sprawdź jak wyglądają&lt;br /&gt;
filtry przestrzenne &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; dla różnych lokalizacji&lt;br /&gt;
i porównaj je koncepcyjnie z filtrami CSP z Sesji 1–3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11773</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11773"/>
		<updated>2026-04-27T13:41:38Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Konfiguracja ścieżki MATLAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
==Instalacja FieldTrip==&lt;br /&gt;
&lt;br /&gt;
;Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
===Pobranie toolboxu===&lt;br /&gt;
&lt;br /&gt;
Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
===Konfiguracja ścieżki MATLAB===&lt;br /&gt;
&lt;br /&gt;
Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('~/fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga krytyczna — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
===Trwała konfiguracja przez startup.m===&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB:&lt;br /&gt;
Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
===Weryfikacja instalacji===&lt;br /&gt;
&lt;br /&gt;
Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11772</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11772"/>
		<updated>2026-04-27T13:40:50Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Pobranie toolboxu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
==Instalacja FieldTrip==&lt;br /&gt;
&lt;br /&gt;
;Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
===Pobranie toolboxu===&lt;br /&gt;
&lt;br /&gt;
Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
===Konfiguracja ścieżki MATLAB===&lt;br /&gt;
&lt;br /&gt;
Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('C:\fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga krytyczna — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
===Trwała konfiguracja przez startup.m===&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB:&lt;br /&gt;
Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
===Weryfikacja instalacji===&lt;br /&gt;
&lt;br /&gt;
Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11771</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11771"/>
		<updated>2026-04-27T13:40:01Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Podsumowanie: kiedy stosować którą metodę */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
==Instalacja FieldTrip==&lt;br /&gt;
&lt;br /&gt;
;Wymagania wstępne:&lt;br /&gt;
FieldTrip wymaga MATLABa. Przed instalacją sprawdź kompatybilność swojej wersji:&lt;br /&gt;
[https://www.fieldtriptoolbox.org/faq/matlab/requirements MATLAB requirements]&lt;br /&gt;
&lt;br /&gt;
===Pobranie toolboxu===&lt;br /&gt;
&lt;br /&gt;
Pobierz najnowszą wersję ze strony:&lt;br /&gt;
&lt;br /&gt;
[https://www.fieldtriptoolbox.org/download.php Pobierz FieldTrip]&lt;br /&gt;
&lt;br /&gt;
Rozpakuj archiwum ZIP w wybranym katalogu, np. &amp;lt;code&amp;gt;C:\fieldtrip&amp;lt;/code&amp;gt; (Windows)&lt;br /&gt;
lub &amp;lt;code&amp;gt;~/matlab/fieldtrip&amp;lt;/code&amp;gt; (Linux/macOS).&lt;br /&gt;
&lt;br /&gt;
;Ważne: nie zmieniaj wewnętrznej struktury katalogów po rozpakowaniu —&lt;br /&gt;
FieldTrip dynamicznie zarządza swoimi podkatalogami.&lt;br /&gt;
&lt;br /&gt;
===Konfiguracja ścieżki MATLAB===&lt;br /&gt;
&lt;br /&gt;
Pełna instrukcja: [https://www.fieldtriptoolbox.org/faq/matlab/installation Installation and setting up the path]&lt;br /&gt;
&lt;br /&gt;
Uruchom poniższe polecenia na początku każdej sesji pracy z FieldTrip&lt;br /&gt;
(lub wstaw je do pliku &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; — patrz niżej):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath                       % wyczyść aktualną ścieżkę&lt;br /&gt;
addpath('C:\fieldtrip')                  % podaj tu swoją ścieżkę do FieldTrip&lt;br /&gt;
ft_defaults                              % skonfiguruj FieldTrip i minimalne podkatalogi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Uwaga krytyczna — częsty błąd:&lt;br /&gt;
Nie używaj &amp;lt;code&amp;gt;addpath(genpath(...))&amp;lt;/code&amp;gt; ani przycisku „Add with Subfolders&amp;quot; w MATLAB GUI.&lt;br /&gt;
FieldTrip samodzielnie dodaje potrzebne podkatalogi przez &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
i &amp;lt;code&amp;gt;ft_hastoolbox&amp;lt;/code&amp;gt; — dodanie wszystkiego ręcznie powoduje konflikty&lt;br /&gt;
z funkcjami SPM, EEGLAB i wbudowanymi funkcjami MATLABa&lt;br /&gt;
(w szczególności z funkcjami z katalogu &amp;lt;code&amp;gt;fieldtrip/compat&amp;lt;/code&amp;gt;&lt;br /&gt;
przeznaczonymi tylko dla starych wersji MATLABa).&lt;br /&gt;
&lt;br /&gt;
===Trwała konfiguracja przez startup.m===&lt;br /&gt;
&lt;br /&gt;
Żeby nie powtarzać powyższych poleceń przy każdym uruchomieniu MATLABa,&lt;br /&gt;
utwórz plik &amp;lt;code&amp;gt;startup.m&amp;lt;/code&amp;gt; w swoim katalogu MATLABa&lt;br /&gt;
(zwykle &amp;lt;code&amp;gt;Dokumenty/MATLAB/startup.m&amp;lt;/code&amp;gt;) z zawartością:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
restoredefaultpath&lt;br /&gt;
addpath('C:\fieldtrip')   % zmień na swoją ścieżkę&lt;br /&gt;
ft_defaults&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MATLAB wykonuje ten plik automatycznie przy każdym uruchomieniu.&lt;br /&gt;
&lt;br /&gt;
;Uwaga dla użytkowników EEGLAB:&lt;br /&gt;
Jeśli korzystasz z EEGLAB i FieldTrip w tej samej sesji,&lt;br /&gt;
zawsze ładuj FieldTrip przez &amp;lt;code&amp;gt;restoredefaultpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ft_defaults&amp;lt;/code&amp;gt;,&lt;br /&gt;
a nie przez interfejs EEGLAB. Oba toolboxy zawierają funkcje o tych samych nazwach&lt;br /&gt;
(np. &amp;lt;code&amp;gt;eegplot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topoplot&amp;lt;/code&amp;gt;) — kolejność na ścieżce decyduje,&lt;br /&gt;
która wersja zostanie wywołana.&lt;br /&gt;
&lt;br /&gt;
===Weryfikacja instalacji===&lt;br /&gt;
&lt;br /&gt;
Sprawdź poprawność instalacji jednym poleceniem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
ft_defaults&lt;br /&gt;
ft_version&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinieneś zobaczyć numer wersji i datę kompilacji, np.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FieldTrip version 20250901, path: C:\fieldtrip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli MATLAB zgłasza błąd &amp;lt;code&amp;gt;Undefined function 'ft_defaults'&amp;lt;/code&amp;gt;,&lt;br /&gt;
ścieżka nie została ustawiona poprawnie — wróć do kroku z &amp;lt;code&amp;gt;addpath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11770</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11770"/>
		<updated>2026-04-27T13:21:48Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Zastosowania i ograniczenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są nieskorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11769</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11769"/>
		<updated>2026-04-27T13:12:44Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Podsumowanie: kiedy stosować którą metodę */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są niekorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła nieskorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11768</id>
		<title>Laboratorium EEG/CSP</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/CSP&amp;diff=11768"/>
		<updated>2026-04-27T13:11:42Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: /* Zastosowania i ograniczenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/BSS&lt;br /&gt;
&lt;br /&gt;
=Plan zajęć=&lt;br /&gt;
&lt;br /&gt;
Materiał realizowany jest w ciągu 3 tygodni (6 spotkań po ~2,5 h).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sesja !! Temat !! Kluczowe sekcje na tej stronie&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || Wykład BSS + CSP; ćwiczenie symulacyjne&lt;br /&gt;
| [[#Ślepa separacja źródeł (BSS)|Ślepa separacja źródeł]], [[#Common Spatial Pattern|Common Spatial Pattern]], [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]]&lt;br /&gt;
|-&lt;br /&gt;
| '''2'''|| Dane P300: wczytanie, cięcie epok, wizualizacja ERP, implementacja CSP&lt;br /&gt;
| [[#Analiza wstępna|Analiza wstępna]], [[#ZADANIE: Analiza CSP|Analiza CSP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''3'''|| Mapki topograficzne; separacja cech&lt;br /&gt;
| [[#ZADANIE: Analiza CSP|Analiza CSP]] (cd.), [[#Wybór i separacja cech|Wybór i separacja cech]]&lt;br /&gt;
|-&lt;br /&gt;
| '''4'''|| cosSinCSP jako uogólnienie CSP; dane SSVEP&lt;br /&gt;
| [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSVEP]]&lt;br /&gt;
|-&lt;br /&gt;
| '''5'''|| Wykład ICA; komponenty alfa&lt;br /&gt;
| [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]], [[#ZADANIE: Wydobywanie interesujących komponentów|Komponenty alfa]]&lt;br /&gt;
|-&lt;br /&gt;
| '''6'''|| Artefakty (ICLabel/MARA); synteza CSP/cosSinCSP/ICA&lt;br /&gt;
| [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Sesja 1: Ślepa separacja źródeł i CSP — wprowadzenie=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie symulacyjne&lt;br /&gt;
&lt;br /&gt;
Zajęcia wprowadzają do problemu filtracji przestrzennej sygnałów EEG.&lt;br /&gt;
Punktem wyjścia jest ogólny problem ślepej separacji źródeł (BSS),&lt;br /&gt;
z którego CSP wyłania się jako szczególny przypadek dla dwóch warunków&lt;br /&gt;
eksperymentalnych. Filtry przestrzenne omawiane na tych zajęciach stanowią&lt;br /&gt;
fundament klasycznych metod BCI (P300, SSVEP, motor imagery) oraz są&lt;br /&gt;
bezpośrednim odpowiednikiem warstw przestrzennych w sieciach neuronowych&lt;br /&gt;
takich jak ShallowConvNet i EEGNet — do tej analogii wrócimy w sesji 6.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1WrXgWWDJ7g5ZdYltm_8s2NXbGamw4R8N/view?usp=sharing Slajdy do wykładu (PDF)]&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu:&lt;br /&gt;
* model generatywny EEG: &amp;lt;math&amp;gt;x(t) = As(t)&amp;lt;/math&amp;gt;, macierz kowariancji, idea diagonalizacji&lt;br /&gt;
* BSS jako ogólny problem separacji źródeł&lt;br /&gt;
* CSP jako szczególny przypadek: dwa warunki eksperymentalne, iloraz Rayleigha, uogólnione zagadnienie własne&lt;br /&gt;
* interpretacja filtrów i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie symulacyjne:&lt;br /&gt;
Zob. [[#Ćwiczenie symulacyjne|Ćwiczenie symulacyjne]] w sekcji CSP poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie symulacyjne ====&lt;br /&gt;
====Zadania do samodzielnej realizacji====&lt;br /&gt;
&lt;br /&gt;
Poniższy kod dostarcza gotowej infrastruktury: generacji sygnałów, macierzy mieszającej i wizualizacji.&lt;br /&gt;
Zadaniem jest samodzielna implementacja kluczowych kroków analizy CSP.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 1 (obowiązkowe): Obliczenie macierzy kowariancji&lt;br /&gt;
Napisz funkcję &amp;lt;code&amp;gt;srednia_kowariancja(X, ind)&amp;lt;/code&amp;gt;, która dla danej tablicy sygnałów &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&lt;br /&gt;
(wymiary: powtórzenia × kanały × próbki) i wektora indeksów czasowych &amp;lt;code&amp;gt;ind&amp;lt;/code&amp;gt;&lt;br /&gt;
zwraca średnią macierz kowariancji uśrednioną po powtórzeniach.&lt;br /&gt;
Dla każdego powtórzenia zastosuj funkcję &amp;lt;code&amp;gt;cov&amp;lt;/code&amp;gt; i znormalizuj wynik przez jego ślad (&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;).&lt;br /&gt;
Sprawdź wynik porównując z macierzami &amp;lt;code&amp;gt;R_B&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;R_E&amp;lt;/code&amp;gt; obliczonymi w dostarczonym kodzie.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 2 (obowiązkowe): Implementacja CSP&lt;br /&gt;
Korzystając z funkcji &amp;lt;code&amp;gt;eig&amp;lt;/code&amp;gt; oraz macierzy kowariancji obliczonych w zadaniu 1,&lt;br /&gt;
wyznacz macierz filtrów przestrzennych &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; i odpowiadające im wartości własne.&lt;br /&gt;
Odtwórz sygnały źródłowe dla wszystkich powtórzeń.&lt;br /&gt;
Narysuj chmury punktów (amplituda źródła 1 vs amplituda źródła 2) osobno dla warunków&lt;br /&gt;
baseline i ERP — przed transformacją CSP i po niej. Co zmieniło się w kształcie chmur?&lt;br /&gt;
&lt;br /&gt;
Wykreśl także wizualizację przebiegów czasowych sygnałów X i sygnałów S uzyskanych po rozmieszaniu.&lt;br /&gt;
&lt;br /&gt;
;Zadanie 3 (obowiązkowe): Interpretacja wartości własnych&lt;br /&gt;
Wartości własne znajdują się na przekątnej macierzy &amp;lt;code&amp;gt;Lambda&amp;lt;/code&amp;gt;.&lt;br /&gt;
Który filtr najbardziej różnicuje warunki baseline i ERP?&lt;br /&gt;
Jaki jest związek między wartością własną a separacją widoczną na wykresach punktowych?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 4 (dla chętnych): Wpływ macierzy mieszającej&lt;br /&gt;
W dostarczonym kodzie macierz &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; (filtr przestrzenny) wynosi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P = [1 2; 1.5 1.3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zmień ją kolejno na macierz bliską jednostkowej (np. &amp;lt;code&amp;gt;P = [1 0.1; 0.1 1]&amp;lt;/code&amp;gt;)&lt;br /&gt;
oraz na macierz z dużymi elementami pozadiagonalnymi (np. &amp;lt;code&amp;gt;P = [1 5; 4 1]&amp;lt;/code&amp;gt;).&lt;br /&gt;
Jak zmienia się kształt chmury punktów przed transformacją CSP?&lt;br /&gt;
Czy CSP poprawnie oddziela źródła w obu przypadkach?&lt;br /&gt;
&lt;br /&gt;
;Zadanie 5 (dla chętnych): Wpływ szumu&lt;br /&gt;
W kodzie szum jest wyłączony: &amp;lt;code&amp;gt;n = 0*randn(size(tmp))&amp;lt;/code&amp;gt;.&lt;br /&gt;
Usuń mnożnik &amp;lt;code&amp;gt;0*&amp;lt;/code&amp;gt; i zbadaj jak poziom szumu wpływa na separację źródeł.&lt;br /&gt;
Przy jakim stosunku sygnału do szumu CSP przestaje skutecznie rozdzielać warunki?&lt;br /&gt;
&lt;br /&gt;
;Pytanie do dyskusji:&lt;br /&gt;
Dostarczony kod używa &amp;lt;code&amp;gt;eig(R_E, R_B)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alternatywą jest &amp;lt;code&amp;gt;eig(R_E, (R_E+R_B)/2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
Czym różnią się te dwie wersje? W jakich sytuacjach eksperymentalnych&lt;br /&gt;
druga wersja mogłaby być bardziej uzasadniona?&lt;br /&gt;
&lt;br /&gt;
====Szkielet kodu do uzupełnienia====&lt;br /&gt;
&lt;br /&gt;
Poniższy szkielet zawiera gotową infrastrukturę symulacji.&lt;br /&gt;
Uzupełnij brakujące fragmenty oznaczone komentarzem &amp;lt;code&amp;gt;% TUTAJ&amp;lt;/code&amp;gt;&lt;br /&gt;
zgodnie z zadaniami 1–3. Pełny kod referencyjny dostępny jest poniżej&lt;br /&gt;
— zajrzyj do niego dopiero po samodzielnej próbie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% Parametry symulacji — nie modyfikuj tej sekcji&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
P = [1 2; 1.5 1.3];   % filtr przestrzenny (prawdziwy)&lt;br /&gt;
A = P^(-1);            % topografia źródeł&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    s1 = sin(2*pi*11*t + pi/2) + 0.02*randn(size(t));&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2) + 0.01*randn(size(t));&lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));   % Zadanie 5: zmień 0* na 1* aby włączyć szum&lt;br /&gt;
    X(r,:,:) = A*tmp + n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
baseline_ind = find(t &amp;lt; 0.5);&lt;br /&gt;
ERP_ind      = find(t &amp;gt;= 0.5);&lt;br /&gt;
&lt;br /&gt;
R_B = zeros(N_chan, N_chan);&lt;br /&gt;
R_E = zeros(N_chan, N_chan);&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 1: Oblicz średnie macierze kowariancji&lt;br /&gt;
% korzystając z funkcji srednia_kowariancja(X, ind)&lt;br /&gt;
&lt;br /&gt;
% Dla każdego powtórzenia r:&lt;br /&gt;
%   - wytnij fragment sygnału X(r,:,baseline_ind) i analogicznie ERP&lt;br /&gt;
%   - oblicz macierz kowariancji funkcją cov() — pamiętaj o transpozycji&lt;br /&gt;
%   - znormalizuj przez ślad (funkcja trace())&lt;br /&gt;
%   - dodaj do sumy&lt;br /&gt;
% Na końcu podziel przez N_rep&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Użyj funkcji eig(A,B) gdzie A=R_E, B=R_B&lt;br /&gt;
% W wyniku otrzymasz macierz wektorów własnych W (w kolumnach)&lt;br /&gt;
% i macierz Lambda z wartościami własnymi na przekątnej&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 2 cd.: Odtwórz sygnały źródłowe&lt;br /&gt;
% Dla każdego powtórzenia r zastosuj filtr: S(r,:,:) = W' * X(r,:,:)&lt;br /&gt;
&lt;br /&gt;
S = zeros(N_rep, N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
for r = 1:N_rep&lt;br /&gt;
    % TUTAJ: S(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 3: Wizualizacja — chmury punktów przed i po CSP&lt;br /&gt;
x_base_k1 = X(:,1,baseline_ind);&lt;br /&gt;
x_base_k2 = X(:,2,baseline_ind);&lt;br /&gt;
x_ERP_k1  = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_k2  = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
s_base_k1 = squeeze(S(:,1,baseline_ind));&lt;br /&gt;
s_base_k2 = squeeze(S(:,2,baseline_ind));&lt;br /&gt;
s_ERP_k1  = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_k2  = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
figure(1); clf&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
    plot(x_base_k1(:), x_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(x_ERP_k1(:),  x_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal; xlim([-2 2]); ylim([-2 2])&lt;br /&gt;
    xlabel('Kanał 1'); ylabel('Kanał 2')&lt;br /&gt;
    title('Przed CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_base_k1(:), s_base_k2(:), 'b.'); hold on&lt;br /&gt;
    plot(s_ERP_k1(:),  s_ERP_k2(:),  'r.');&lt;br /&gt;
    axis equal&lt;br /&gt;
    xlabel('Źródło 1'); ylabel('Źródło 2')&lt;br /&gt;
    title('Po CSP')&lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
%% Wizualizacja przebiegów czasowych X i S&lt;br /&gt;
% TUTAJ:&lt;br /&gt;
&lt;br /&gt;
%% Zadanie 4 (dla chętnych): zmień macierz P powyżej i powtórz analizę&lt;br /&gt;
%% Zadanie 5 (dla chętnych): włącz szum (zmień 0* na 1* w linii z n=...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang  = matlab&amp;gt;&lt;br /&gt;
% symulowany eksperyment składa się z sinusoidy udającej alfę spoczynkową i&lt;br /&gt;
% funkcji Gaussa udającego potencjał wywołany&lt;br /&gt;
% źródła te są symulowane niezależnie a potem mieszane przez macierz A&lt;br /&gt;
% symulujemy źródła&lt;br /&gt;
% s1 - symuluje alfę&lt;br /&gt;
% s2 - symuluje &amp;quot;potencjał wywołany&amp;quot; (ERP)&lt;br /&gt;
&lt;br /&gt;
%ustawiamy parametry do symulacji sygnałów&lt;br /&gt;
Fs = 100;&lt;br /&gt;
T = 1;&lt;br /&gt;
t = 0:1/Fs:T-1/Fs;&lt;br /&gt;
N_rep = 100;&lt;br /&gt;
N_chan = 2;&lt;br /&gt;
s = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
X = zeros(N_rep,N_chan, length(t));&lt;br /&gt;
&lt;br /&gt;
% filtr przestrzenny - z takimi wagami trzeba wziąść kanały EEG aby odzyskać sygnały źródłowe&lt;br /&gt;
P = [1 2&lt;br /&gt;
    1.5 1.3]; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% topografie - z takimi wagami źródła dokładają się do poszczególnych elektrod&lt;br /&gt;
A = P^(-1); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for r =1:N_rep % tworzymy kolejne realizacje &amp;quot;eksperymentu&amp;quot;&lt;br /&gt;
    s1 = sin(2*pi*11*t +pi/2+ 0*2*pi*rand())+ 0.02*randn(size(t));  % źródło alfa&lt;br /&gt;
    s2 = exp(-((t-0.8)/0.05).^2)+ 0.01*randn(size(t));              % źródło ERP&lt;br /&gt;
       &lt;br /&gt;
    s(r,1,:) = s1;&lt;br /&gt;
    s(r,2,:) = s2;&lt;br /&gt;
    tmp = squeeze(s(r,:,:));&lt;br /&gt;
    n = 0*randn(size(tmp));&lt;br /&gt;
    X(r,:,:) = A*tmp +n; % rzutujemy sygnały źródłowe na elektrody s -&amp;gt; x&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% wycinamy warunki &lt;br /&gt;
% baseline_ind   to indeksy pierwszej połowy każdego powtórzenia &amp;quot;baseline&amp;quot;&lt;br /&gt;
% ERP_ind        to indeksy drugiej połowy każdego powtórzenia zawierająca &amp;quot;ERP&amp;quot;&lt;br /&gt;
baseline_ind = find(t&amp;lt;0.5);&lt;br /&gt;
ERP_ind = find(t&amp;gt;=0.5);&lt;br /&gt;
&lt;br /&gt;
x_baseline_kan_1 = X(:,1,baseline_ind);&lt;br /&gt;
x_baseline_kan_2 = X(:,2,baseline_ind);&lt;br /&gt;
&lt;br /&gt;
x_ERP_kan_1 = X(:,1,ERP_ind);&lt;br /&gt;
x_ERP_kan_2 = X(:,2,ERP_ind);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% liczymy średnie macierze kowariancji:&lt;br /&gt;
R_E = zeros(N_chan,N_chan);&lt;br /&gt;
R_B = zeros(N_chan,N_chan);&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    B = squeeze(X(r,:,baseline_ind)); &lt;br /&gt;
    tmp =cov(B');&lt;br /&gt;
    R_B = R_B + tmp./trace(tmp);%B*B' ;&lt;br /&gt;
 &lt;br /&gt;
    E = squeeze(X(r,:,ERP_ind));&lt;br /&gt;
    tmp = cov(E');&lt;br /&gt;
    R_E = R_E + tmp./trace(tmp);%E*E' ;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
R_B = R_B/N_rep;&lt;br /&gt;
R_E = R_E/N_rep;&lt;br /&gt;
&lt;br /&gt;
% rozwiązujemy uogólnione zagadnienie własne&lt;br /&gt;
[W,Lambda]=eig(R_E,R_B); % możliwa jest też optymalizacja wzg. średniej macierzy kowariancji (R_B+R_A)/2);&lt;br /&gt;
&lt;br /&gt;
% odzyskujemy sygnały źródeł&lt;br /&gt;
for r =1:N_rep&lt;br /&gt;
    S(r,:,:) = W'*squeeze(X(r,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% pobieramy wycinki odpowiadające obu częściom eksperymentu z estymowanych&lt;br /&gt;
% źródeł&lt;br /&gt;
s_baseline_estymowany_kan1 = squeeze(  S(:,1,baseline_ind));&lt;br /&gt;
s_baseline_estymowany_kan2 = squeeze(  S(:,2,baseline_ind));&lt;br /&gt;
&lt;br /&gt;
s_ERP_estymowany_kan1 = squeeze(S(:,1,ERP_ind));&lt;br /&gt;
s_ERP_estymowany_kan2 = squeeze(S(:,2,ERP_ind));&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%% Ilustracje %%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ilustracja sygnałów mierzonych&lt;br /&gt;
figure(1);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,1,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,1,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 1')&lt;br /&gt;
    title('ilustracja sytuacji pomiarowej -\newline znane są potencjały na elektrodach w dwóch warunkach eksperymentalnych')&lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(X(:,2,baseline_ind)))','b'); hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(  X(:,2,ERP_ind)))','r'); hold off&lt;br /&gt;
    xlabel('elektroda 2')&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(x_baseline_kan_1(:),x_baseline_kan_2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(x_ERP_kan_1(:),x_ERP_kan_2(:),'r.');&lt;br /&gt;
    xlim([-2,2])&lt;br /&gt;
    ylim([-2,2])&lt;br /&gt;
    axis equal&lt;br /&gt;
    &lt;br /&gt;
    % wektor własny odpowiadający największej wartości własnej jest&lt;br /&gt;
    % kierunkiem najbardziej różnicującym warunki eksperymentalne&lt;br /&gt;
    disp('wartości własne znajdują się na przekątnej macierzy Lambda')&lt;br /&gt;
    disp(Lambda)&lt;br /&gt;
    % rysujemy wersory jednostkowe w kierunkach wektorów własnych&lt;br /&gt;
    w1 = W(:,1); &lt;br /&gt;
    w1 = w1/norm(w1);&lt;br /&gt;
    w2 = W(:,2); &lt;br /&gt;
    w2 = w2/norm(w2);&lt;br /&gt;
    line([0, w1(1) ],[0,w1(2)],'Color',[0,0.3,0])&lt;br /&gt;
    text(w1(1),w1(2),'wektor własny 1')&lt;br /&gt;
    line([0, w2(1) ],[0,w2(2)],'Color',[1,0,1])&lt;br /&gt;
    text(w2(1),w2(2),'wektor własny 2')&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda na elektrodzie 1')&lt;br /&gt;
    ylabel('Amplituda na elektrodzie 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&lt;br /&gt;
% Ilustracja estymowanych źródeł&lt;br /&gt;
figure(2);clf&lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,1,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,1,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  1')&lt;br /&gt;
    title('ilustracja estymacji -\newline estymowane są potencjały źródeł w dwóch warunkach eksperymentalnych')    &lt;br /&gt;
subplot(2,2,3);&lt;br /&gt;
    plot(t(baseline_ind),(squeeze(S(:,2,baseline_ind)))','b');hold on&lt;br /&gt;
    plot(t(ERP_ind),(squeeze(S(:,2,ERP_ind)))','r');hold off&lt;br /&gt;
    xlabel('estymowane zrodlo  2');&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
    plot(s_baseline_estymowany_kan1(:),s_baseline_estymowany_kan2(:),'b.');&lt;br /&gt;
    hold on&lt;br /&gt;
    plot(s_ERP_estymowany_kan1(:),s_ERP_estymowany_kan2(:),'r.');   &lt;br /&gt;
    &lt;br /&gt;
    xlabel('Amplituda estym. źródła 1')&lt;br /&gt;
    ylabel('Amplituda estym. źródła 2')   &lt;br /&gt;
    legend('baseline','ERP')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
=Sesja 2: CSP dla P300 — dane realne=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pracujemy z danymi kalibracyjnymi z eksperymentu P300.&lt;br /&gt;
Celem sesji jest przejście pełnego pipeline'u: od surowych danych&lt;br /&gt;
do odtworzonych źródeł CSP.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* wczytanie danych kalibracyjnych, identyfikacja znaczników T i NT&lt;br /&gt;
* cięcie epok (−200 do +800 ms), usuwanie trendu liniowego&lt;br /&gt;
* montaż względem średniej ze wszystkich elektrod&lt;br /&gt;
* wizualizacja ERP w układzie topograficznym&lt;br /&gt;
* obliczenie macierzy kowariancji R&amp;lt;sub&amp;gt;T&amp;lt;/sub&amp;gt; i R&amp;lt;sub&amp;gt;NT&amp;lt;/sub&amp;gt;, normalizacja przez ślad&lt;br /&gt;
* rozwiązanie uogólnionego zagadnienia własnego: &amp;lt;code&amp;gt;[W, Lambda] = eig(R_T, R_NT)&amp;lt;/code&amp;gt;&lt;br /&gt;
* odtworzenie sygnałów źródłowych: &amp;lt;code&amp;gt;S = W'*EEG&amp;lt;/code&amp;gt;&lt;br /&gt;
* przegląd estymowanych źródeł w dwóch warunkach&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Dane: https://www.fuw.edu.pl/~jarekz/LabEEG/KalibracjaP300.tar.gz&lt;br /&gt;
&lt;br /&gt;
===ZADANIE: Analiza CSP===&lt;br /&gt;
&lt;br /&gt;
Przegląd badań o P300: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2715154/&lt;br /&gt;
&lt;br /&gt;
Link do Read menager [https://drive.google.com/file/d/1OgOduK5Zn7GgNl5XdCyLWXHJ7wTJIWcC/view?usp=share_link]&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDS3RXNWdBbkxEQ2c]&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
* Wykonać analizę CSP wzmacniającą potencjał P300.&lt;br /&gt;
* Zaprezentować średnią ze wszystkich kanałów źródłowych z warunku target (jeden kolor) i non-target (inny kolor) w subplotach ułożonych w prostokątnej siatce. Zaobserwować, dla którego kanału średnie różnią się najbardziej. Czy jest związek tego kanału z wartościami własnymi?&lt;br /&gt;
&lt;br /&gt;
* Dla kanału najbardziej różnicującego wykonać mapki topograficzne wektorów odpowiadających:&lt;br /&gt;
** filtrowi przestrzennemu &lt;br /&gt;
** rzutu topograficznego źródła na elektrody.&lt;br /&gt;
&lt;br /&gt;
===Szkielet kodu do analizy wstępnej===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
%% KROK 1: Wczytanie danych&lt;br /&gt;
% ReadManager to pomocnicza klasa do odczytu plików w formacie OpenBCI.&lt;br /&gt;
% Przyjmuje trzy pliki: XML z metadanymi, RAW z próbkami i TAG ze znacznikami zdarzeń.&lt;br /&gt;
nazwaPliku = 'p_6301423_calibration_p300.obci';&lt;br /&gt;
nameOfXMLFile  = strcat(nazwaPliku, '.xml');&lt;br /&gt;
nameOfTagFile  = strcat(nazwaPliku, '.tag');&lt;br /&gt;
namesOfDataFiles = strcat(nazwaPliku, '.raw');&lt;br /&gt;
&lt;br /&gt;
rm = ReadManager(nameOfXMLFile, namesOfDataFiles, nameOfTagFile);&lt;br /&gt;
&lt;br /&gt;
% Pobieramy podstawowe parametry nagrania&lt;br /&gt;
numberOfChannels  = rm.get_param('number_of_channels');&lt;br /&gt;
namesOfChannels   = rm.get_param('channels_names');&lt;br /&gt;
samplingFrequency = rm.get_param('sampling_frequency');&lt;br /&gt;
&lt;br /&gt;
% Pobieramy listę wszystkich znaczników zdarzeń z nagrania&lt;br /&gt;
tagsStruct = rm.get_tags();&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Identyfikacja znaczników Target i Non-Target&lt;br /&gt;
% Każdy znacznik typu 'blink' odpowiada jednemu mignięciu w eksperymencie P300.&lt;br /&gt;
% Pole 'index' mówi który symbol mignął, pole 'target' który symbol był oczekiwany.&lt;br /&gt;
% Jeśli index == target to było to mignięcie docelowe (Target), w przeciwnym razie&lt;br /&gt;
% Non-Target.&lt;br /&gt;
targetTimeStamps    = [];&lt;br /&gt;
NonTargetTimeStamps = [];&lt;br /&gt;
&lt;br /&gt;
for structNumber = 1:length(tagsStruct)&lt;br /&gt;
    if strcmp(tagsStruct(structNumber).name, 'blink')&lt;br /&gt;
        index  = tagsStruct(structNumber).children.index;&lt;br /&gt;
        target = tagsStruct(structNumber).children.target;&lt;br /&gt;
        if index == target&lt;br /&gt;
            targetTimeStamps    = [targetTimeStamps    tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        else&lt;br /&gt;
            NonTargetTimeStamps = [NonTargetTimeStamps tagsStruct(structNumber).start_timestamp];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Wczytanie i filtrowanie sygnału&lt;br /&gt;
samples = double(rm.get_samples());&lt;br /&gt;
samples = samples(1:8,:);   % odrzucamy kanały bez EEG&lt;br /&gt;
numberOfChannels = 8;&lt;br /&gt;
&lt;br /&gt;
% Filtr dolnoprzepustowy Czebyszewa 2. rodzaju — odcięcie 25 Hz&lt;br /&gt;
[b, a] = cheby2(6, 80, 25/(samplingFrequency/2), 'low');&lt;br /&gt;
for ch = 1:numberOfChannels&lt;br /&gt;
    samples(ch,:) = filtfilt(b, a, samples(ch,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Montaż względem średniej (common average reference)&lt;br /&gt;
% Odejmujemy od każdego kanału średnią ze wszystkich kanałów w danej chwili.&lt;br /&gt;
% Jest to prostsze i bardziej ogólne niż montaż względem połączonych uszu.&lt;br /&gt;
M = -ones(numberOfChannels, numberOfChannels) / numberOfChannels;&lt;br /&gt;
M = M + eye(numberOfChannels) * (numberOfChannels+1) / numberOfChannels;&lt;br /&gt;
samples = 0.0715 * M * samples;&lt;br /&gt;
&lt;br /&gt;
%% KROK 5: Cięcie epok&lt;br /&gt;
PRE  = -0.2;&lt;br /&gt;
POST =  0.8;&lt;br /&gt;
wycinek = floor(PRE*samplingFrequency : POST*samplingFrequency);&lt;br /&gt;
&lt;br /&gt;
TargetSignal    = zeros(length(targetTimeStamps),    numberOfChannels, length(wycinek));&lt;br /&gt;
NonTargetSignal = zeros(length(NonTargetTimeStamps), numberOfChannels, length(wycinek));&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(targetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(targetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';   % usuwanie trendu liniowego&lt;br /&gt;
        TargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for trialNumber = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    trigerOnset = floor(NonTargetTimeStamps(trialNumber) * samplingFrequency);&lt;br /&gt;
    tenWycinek  = wycinek + trigerOnset;&lt;br /&gt;
    if tenWycinek(1) &amp;gt; 0 &amp;amp;&amp;amp; tenWycinek(end) &amp;lt;= size(samples,2)&lt;br /&gt;
        tmpSignal = samples(:, tenWycinek);&lt;br /&gt;
        tmpSignal = detrend(tmpSignal')';&lt;br /&gt;
        NonTargetSignal(trialNumber,:,:) = tmpSignal;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Oś czasu w milisekundach — przyda się do rysowania&lt;br /&gt;
times = (wycinek / samplingFrequency) * 1000;&lt;br /&gt;
&lt;br /&gt;
%% KROK 6: Wizualizacja ERP w układzie topograficznym&lt;br /&gt;
% Oblicz potencjały wywołane (ERP) jako średnie po powtórzeniach&lt;br /&gt;
ERP_T  = squeeze(mean(TargetSignal,    1));   % wymiary: kanały × czas&lt;br /&gt;
ERP_NT = squeeze(mean(NonTargetSignal, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_T i ERP_NT dla każdego kanału w subplotach&lt;br /&gt;
% ułożonych w siatce odpowiadającej przybliżonym pozycjom elektrod.&lt;br /&gt;
% Na każdym subplocie nałóż oba warunki różnymi kolorami.&lt;br /&gt;
% Oś X: czas w ms (użyj wektora times), oś Y: amplituda w µV.&lt;br /&gt;
% Zadbaj o legendę i tytuły z nazwami kanałów (namesOfChannels).&lt;br /&gt;
&lt;br /&gt;
%% KROK 7: Obliczenie średnich macierzy kowariancji&lt;br /&gt;
% Dla każdego powtórzenia oblicz macierz kowariancji funkcją cov(),&lt;br /&gt;
% znormalizuj przez jej ślad (trace()), a następnie uśrednij po powtórzeniach.&lt;br /&gt;
% Pamiętaj: cov() oczekuje macierzy próbki × kanały, czyli potrzebujesz transpozycji.&lt;br /&gt;
&lt;br /&gt;
R_T  = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
R_NT = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(targetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie T, oblicz kowariancję, znormalizuj, dodaj do R_T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:length(NonTargetTimeStamps)&lt;br /&gt;
    % TUTAJ: wytnij r-te powtórzenie NT, oblicz kowariancję, znormalizuj, dodaj do R_NT&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel R_T i R_NT przez odpowiednie liczby powtórzeń&lt;br /&gt;
&lt;br /&gt;
%% KROK 8: Rozwiązanie uogólnionego zagadnienia własnego&lt;br /&gt;
% Szukamy filtrów przestrzennych W maksymalizujących stosunek mocy&lt;br /&gt;
% w warunku T względem NT: eig(R_T, R_NT)&lt;br /&gt;
% W kolumnach W znajdują się filtry, na przekątnej Lambda — wartości własne.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
disp('Wartości własne (przekątna Lambda):')&lt;br /&gt;
disp(diag(Lambda))&lt;br /&gt;
&lt;br /&gt;
%% KROK 9: Odtworzenie sygnałów źródłowych&lt;br /&gt;
% Dla każdego powtórzenia zastosuj filtr przestrzenny:&lt;br /&gt;
% s(r,:,:) = W' * x(r,:,:)&lt;br /&gt;
% Pamiętaj o wymiarach — squeeze() może być pomocne.&lt;br /&gt;
&lt;br /&gt;
S_T  = zeros(size(TargetSignal));&lt;br /&gt;
S_NT = zeros(size(NonTargetSignal));&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(TargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_T(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for r = 1:size(NonTargetSignal, 1)&lt;br /&gt;
    % TUTAJ: S_NT(r,:,:) = ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 10: Wizualizacja estymowanych źródeł&lt;br /&gt;
% Narysuj średnie przebiegi źródeł (ERP w przestrzeni CSP) dla obu warunków.&lt;br /&gt;
% Ułóż subploty w prostokątnej siatce — jeden subplot na każde źródło.&lt;br /&gt;
% Dla którego źródła różnica między T i NT jest największa?&lt;br /&gt;
% Czy odpowiada to źródłu z największą wartością własną?&lt;br /&gt;
&lt;br /&gt;
ERP_S_T  = squeeze(mean(S_T,  1));&lt;br /&gt;
ERP_S_NT = squeeze(mean(S_NT, 1));&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: narysuj ERP_S_T i ERP_S_NT w subplotach&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 3: CSP dla P300 — interpretacja i separacja cech=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Kontynuacja analizy CSP. Celem sesji jest interpretacja wyników&lt;br /&gt;
w kategoriach fizjologicznych oraz ocena separowalności klas&lt;br /&gt;
w przestrzeni cech opartej na mocy sygnału.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* mapki topograficzne filtra przestrzennego i topografii źródła &lt;br /&gt;
* związek wartości własnych z siłą różnicowania warunków T i NT&lt;br /&gt;
* wykresy punktowe mocy: oś X — moc składowej z największą wartością własną, oś Y — moc kolejnej składowej; jeden punkt = jedno powtórzenie&lt;br /&gt;
* uśrednianie po 2, 4, 6, 8 i 10 realizacjach — obserwacja poprawy separacji wraz z liczbą uśrednień&lt;br /&gt;
* dyskusja: utożsamianie komponentów CSP z fizjologicznymi źródłami jest ryzykowne; komponenty maksymalizują kontrast między warunkami, niekoniecznie odpowiadają izolowanym generatorom&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Szkielet kodu do analizy wstępnej|Szkielet kodu do analizy wstępnej]] i [[#Zadanie: Wybór i separacja cech|Zadanie: Wybór i separacja cech]] poniżej.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zadanie: Wybór i separacja cech===&lt;br /&gt;
* Przedstaw na rysunkach nałożone na siebie pojedyncze realizacje z warunków target i non-target po rzutowaniu na wektor &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odpowiadający największej i kolejnej wartości  własnej. &lt;br /&gt;
* Przedstaw wykresy punktowe takie, że na jednej osi jest moc sygnału (suma kwadratów wartości próbek w wybranym zakresie czasu) odpowiadającego największej wartości własnej, a na drugiej osi kolejnej (mniejszej) wartości własnej; jeden punkt reprezentuje jedno powtórzenie.&lt;br /&gt;
* Wykonaj serię wykresów jak w poprzednim punkcie dla uśrednień sygnałów kolejno po 2, 4, 6, 8 i 10 realizacjach:&lt;br /&gt;
**  Liczymy potencjał wywołany dla danej liczby powtórzeń. &lt;br /&gt;
** Następnie podnosimy wartości próbek do kwadratu&lt;br /&gt;
**  i sumujemy je w wybranym zakresie czasu.&lt;br /&gt;
* Zaobserwuj jak zmienia się separacja w grupach target i non-target.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
[https://robintibor.github.io/eeg-deep-learning-phd-thesis/DeepArchitectures.html Archirtektury sieci do BCI: ConvNet]&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/figure/The-architecture-of-EEGNet-F1-S1-model-F1-and-S1-represent-the-number-of-temporal_fig3_347073448 EEGNet]&lt;br /&gt;
&lt;br /&gt;
=Sesja 4: Filtry przestrzenne dla SSEP — cosSinCSP=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza metodę cosSinCSP jako naturalne uogólnienie CSP&lt;br /&gt;
o wiedzę dziedzinową dotyczącą sygnału SSEP. W klasycznym CSP&lt;br /&gt;
dwa warunki eksperymentalne definiują dwie macierze kowariancji.&lt;br /&gt;
W cosSinCSP rolę jednej z macierzy przejmuje projekcja sygnału&lt;br /&gt;
na przestrzeń sinusów i cosinusów częstości stymulacji i jej harmonicznych.&lt;br /&gt;
Formalizm ilorazu Rayleigha i uogólnionego zagadnienia własnego&lt;br /&gt;
pozostaje identyczny.&lt;br /&gt;
&lt;br /&gt;
Dane używane na tych zajęciach pochodzą z eksperymentu SSEP&lt;br /&gt;
z archiwum — bez sesji rejestracyjnej. Na wykresach widma&lt;br /&gt;
sygnału przed transformacją CSP dominuje artefakt sieciowy 50 Hz,&lt;br /&gt;
który praktycznie zasłania odpowiedź na stymulację. Zadaniem&lt;br /&gt;
jest sprawdzenie czy cosSinCSP potrafi ten sygnał wydobyć.&lt;br /&gt;
&lt;br /&gt;
;Zakres:&lt;br /&gt;
* idea cosSinCSP: macierz S złożona z sinusów i cosinusów harmonicznych, projekcja sygnału na przestrzeń SSEP i resztę Y&lt;br /&gt;
* implementacja funkcji &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; w MATLAB&lt;br /&gt;
* analiza danych archiwalnych: widma Welcha dla kanałów oryginalnych i źródeł CSP — porównanie SNR przed i po transformacji&lt;br /&gt;
* prezentacja filtrów przestrzennych i topografii źródeł&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#Filtry przestrzenne dla SSEP|Filtry przestrzenne dla SSEP]] poniżej.&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla SSEP==&lt;br /&gt;
&lt;br /&gt;
===Teoria===&lt;br /&gt;
&lt;br /&gt;
Ciekawa koncepcja filtra przestrzennego dla SSEP zaprezentowana jest tu: http://www.eurasip.org/Proceedings/Eusipco/Eusipco2009/contents/papers/1569193209.pdf&lt;br /&gt;
&lt;br /&gt;
Pokrótce można ją rozumieć podobnie do tego co robiliśmy rozważając filtry przestrzenne CSP z tym, że dla SSEP oraz innych potencjałów wywołanych stanu ustalonego możemy skorzystać z dodatkowych informacji dotyczących poszukiwanych źródeł. Wiemy mianowicie, że powinny one oscylować z częstością bodźca i być może jej harmonicznych.&lt;br /&gt;
&lt;br /&gt;
Przyda nam się macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana tak, że w kolejnych kolumnach znajdują się sinusy i cosinusy kolejnych częstości harmonicznych. Wektory te unormujemy, żeby miały energię równą 1. Innymi słowy macierz &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; zbudowana jest z wersorów rozpinających przestrzeń, w której powinien znajdować się sygnał SSEP.&lt;br /&gt;
&lt;br /&gt;
W Matlabie możemy taką macierz zbudować tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Fs                - częstość próbkowania&lt;br /&gt;
% numberOfSamples   - długość sygnału w próbkach&lt;br /&gt;
% numberOfHarmonics - liczba harmonicznych, które chcemy włączyć do analizy&lt;br /&gt;
t = (0:1:numberOfSamples - 1) / Fs;&lt;br /&gt;
S = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S(:,(harmonicNumber - 1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby w badanym sygnale znaleźć składowe odpowiadające SSEP musimy rzutować sygnał &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (macierz sygnałów ''kanały &amp;amp;times; próbki'') na przestrzeń rozpiętą przez &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;A = X S&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zawiera współczynniki będące iloczynami skalarnymi sygnałów i wersorów — mówią one o tym jak dużo sinusa bądź cosinusa o danej częstości jest w pierwotnym sygnale. Komponenty SSEP zawarte w sygnale &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; odzyskujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathrm{SSEP} = A S^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modelujemy rejestrowany sygnał jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;X = \mathrm{SSEP} + Y&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;Y = X - \mathrm{SSEP}&amp;lt;/math&amp;gt;&lt;br /&gt;
to wszystkie komponenty sygnału, które nas nie interesują.&lt;br /&gt;
&lt;br /&gt;
Filtr przestrzenny, który chcemy zbudować powinien maksymalizować stosunek wariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; do wariancji &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Macierz kowariancji powinna być uśredniona po powtórzeniach, a kowariancja sygnału w każdym powtórzeniu powinna być znormalizowana przez jej ślad. Dalej stosujemy technikę znaną z CSP: maksymalizację ilorazu Rayleigha przez rozwiązanie uogólnionego zagadnienia własnego dla macierzy kowariancji &amp;lt;math&amp;gt;\mathrm{SSEP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zadanie: implementacja funkcji cosSinCSP===&lt;br /&gt;
&lt;br /&gt;
Dane do zadania: [[Plik:PrzykladoweDaneSSVEP.mat.gz]].&lt;br /&gt;
Pełny przykład z danymi z eksperymentu SSEP: [[Plik:SSVEP_demo_csp.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję &amp;lt;code&amp;gt;cosSinCSP&amp;lt;/code&amp;gt; zgodnie z poniższym szkieletem.&lt;br /&gt;
Prawidłowo zaimplementowana funkcja wraz ze skryptem demonstracyjnym poniżej&lt;br /&gt;
powinna generować rysunek: [[Plik:Rys_SSVEP_demo.png|400px|podpis grafiki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
% cosSinCSP - filtr przestrzenny dla sygnałów SSEP&lt;br /&gt;
%&lt;br /&gt;
% Wejście:&lt;br /&gt;
%   signal                - dane EEG, wymiary: powtórzenia × kanały × próbki&lt;br /&gt;
%   stimulationFrequency  - częstość stymulacji w Hz&lt;br /&gt;
%   numberOfHarmonics     - liczba harmonicznych do uwzględnienia&lt;br /&gt;
%   Fs                    - częstość próbkowania w Hz&lt;br /&gt;
%&lt;br /&gt;
% Wyjście:&lt;br /&gt;
%   W      - macierz filtrów przestrzennych (kanały × kanały), filtry w kolumnach&lt;br /&gt;
%   Lambda - macierz diagonalna wartości własnych&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Zbuduj macierz referencyjną S (sinusy i cosinusy harmonicznych)&lt;br /&gt;
% S ma wymiary: próbki × 2*numberOfHarmonics&lt;br /&gt;
% Każda kolumna to jeden wersor (unormowany sinus lub cosinus).&lt;br /&gt;
% Wróć do sekcji Teoria powyżej i przełóż tamten kod na tę funkcję.&lt;br /&gt;
&lt;br /&gt;
% TUTAJ&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Oblicz średnie macierze kowariancji C_SSEP i C_Y&lt;br /&gt;
% Dla każdego powtórzenia wytnij sygnał x (kanały × próbki),&lt;br /&gt;
% rozłóż go na składową SSEP i resztę Y zgodnie z równaniami z sekcji Teoria,&lt;br /&gt;
% oblicz macierze kowariancji obu składowych, znormalizuj przez ślad&lt;br /&gt;
% i uśrednij po powtórzeniach.&lt;br /&gt;
&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz SSEP i Y&lt;br /&gt;
&lt;br /&gt;
    % TUTAJ: oblicz kowariancje, znormalizuj, dodaj do C_SSEP i C_Y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: podziel C_SSEP i C_Y przez numberOfTrials&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Rozwiąż uogólnione zagadnienie własne&lt;br /&gt;
% Znajdź filtry przestrzenne maksymalizujące stosunek mocy SSEP do mocy Y.&lt;br /&gt;
% Analogia z CSP: jakie macierze wstawiłeś do eig() tam?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [W, Lambda] = ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Wskazówka do interpretacji wyników:&lt;br /&gt;
Filtr związany z największą wartością własną daje komponent&lt;br /&gt;
o największym stosunku mocy SSEP do mocy tła.&lt;br /&gt;
Sprawdź na widmach Welcha czy odpowiada on składowej&lt;br /&gt;
z wyraźnym pikiem przy częstości stymulacji.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=Rozwiązanie — pokaż dopiero po samodzielnej próbie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function [W, Lambda] = cosSinCSP(signal, stimulationFrequency, numberOfHarmonics, Fs)&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials, numberOfChannels, numberOfSamples] = size(signal);&lt;br /&gt;
&lt;br /&gt;
%% KROK 1: Macierz referencyjna S&lt;br /&gt;
t = (0:1:numberOfSamples-1) / Fs;&lt;br /&gt;
S_ref = zeros(numberOfSamples, 2*numberOfHarmonics);&lt;br /&gt;
&lt;br /&gt;
for harmonicNumber = 1:numberOfHarmonics&lt;br /&gt;
    c = cos(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    s = sin(2*pi*stimulationFrequency*harmonicNumber*t);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 1) = c/norm(c);&lt;br /&gt;
    S_ref(:,(harmonicNumber-1)*2 + 2) = s/norm(s);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 2: Średnie macierze kowariancji&lt;br /&gt;
C_SSEP = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
C_Y    = zeros(numberOfChannels, numberOfChannels);&lt;br /&gt;
&lt;br /&gt;
for trial = 1:numberOfTrials&lt;br /&gt;
    x    = squeeze(signal(trial, :, :));   % kanały × próbki&lt;br /&gt;
    A    = x * S_ref;                      % projekcja na przestrzeń SSEP&lt;br /&gt;
    SSEP = A * S_ref';                     % rekonstrukcja składowej SSEP&lt;br /&gt;
    Y    = x - SSEP;                       % reszta&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(SSEP');&lt;br /&gt;
    C_SSEP = C_SSEP + tmp/trace(tmp);&lt;br /&gt;
&lt;br /&gt;
    tmp = cov(Y');&lt;br /&gt;
    C_Y = C_Y + tmp/trace(tmp);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
C_SSEP = C_SSEP / numberOfTrials;&lt;br /&gt;
C_Y    = C_Y    / numberOfTrials;&lt;br /&gt;
&lt;br /&gt;
%% KROK 3: Uogólnione zagadnienie własne&lt;br /&gt;
[W, Lambda] = eig(C_SSEP, C_Y);&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
===Skrypt demonstracyjny i analiza wyników===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% wczytujemy dane&lt;br /&gt;
load('PrzykladoweDaneSSVEP.mat');&lt;br /&gt;
&lt;br /&gt;
[numberOfTrials numberOfChannels numberOfSamples] = size(X.data);&lt;br /&gt;
namesOfChannels = X.channels;&lt;br /&gt;
&lt;br /&gt;
numberOfHarmonics = 3;&lt;br /&gt;
signal = X.data;   % powtórzenie × kanał × próbki&lt;br /&gt;
&lt;br /&gt;
[W, Lambda] = cosSinCSP(signal, X.stimulation, numberOfHarmonics, X.sampling);&lt;br /&gt;
&lt;br /&gt;
%% Odtworzenie sygnałów źródłowych&lt;br /&gt;
S = zeros(size(signal));&lt;br /&gt;
for powt = 1:size(signal,1)&lt;br /&gt;
    S(powt,:,:) = W' * squeeze(signal(powt,:,:));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Widma Welcha: kanały oryginalne vs źródła CSP&lt;br /&gt;
figure('Name', ['Stymulacja: ', num2str(X.stimulation), ' Hz'])&lt;br /&gt;
for i = 1:numberOfChannels&lt;br /&gt;
    subplot(2, numberOfChannels, i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        x = squeeze(signal(rep,i,:));&lt;br /&gt;
        [Pxx, ff] = pwelch(x, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pxx;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(namesOfChannels{i})&lt;br /&gt;
&lt;br /&gt;
    subplot(2, numberOfChannels, numberOfChannels+i)&lt;br /&gt;
    PP = 0;&lt;br /&gt;
    for rep = 1:numberOfTrials&lt;br /&gt;
        s = squeeze(S(rep,i,:));&lt;br /&gt;
        [Pss, ff] = pwelch(s, X.sampling, 1, X.sampling, X.sampling);&lt;br /&gt;
        PP = PP + Pss;&lt;br /&gt;
    end&lt;br /&gt;
    plot(ff(ff&amp;lt;60), PP(ff&amp;lt;60))&lt;br /&gt;
    title(['źródło CSP: ', num2str(i)])&lt;br /&gt;
    xlabel(['\lambda = ', num2str(Lambda(i,i), '%.2f')])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% KROK 4: Mapki topograficzne&lt;br /&gt;
% Zidentyfikuj komponent z największą wartością własną.&lt;br /&gt;
% Narysuj dwie mapki przy użyciu funkcji topoplot() z pakietu EEGLAB:&lt;br /&gt;
%&lt;br /&gt;
% (a) Filtr przestrzenny: wagi z jakimi kanały EEG składają się na ten komponent.&lt;br /&gt;
%     Wskazówka: filtr to kolumna macierzy W.&lt;br /&gt;
%&lt;br /&gt;
% (b) Topografia źródła: z jakimi wagami komponent dociera do poszczególnych elektrod.&lt;br /&gt;
%     Wskazówka: topografia zawarta jest w wierszach macierzy odwrotnej do W —&lt;br /&gt;
%     przypomnij sobie analogiczny krok z analizy CSP dla P300.&lt;br /&gt;
%&lt;br /&gt;
% Czym różnią się te dwie mapki? Którą łatwiej interpretować fizjologicznie?&lt;br /&gt;
&lt;br /&gt;
% TUTAJ: [~, idx] = max(diag(Lambda));&lt;br /&gt;
% TUTAJ: topoplot(...)  % filtr&lt;br /&gt;
% TUTAJ: topoplot(...)  % topografia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sesja 5: ICA — teoria i wydobywanie interesującego komponentu=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza analizę składowych niezależnych (ICA) jako trzecie&lt;br /&gt;
podejście do problemu ślepej separacji źródeł — obok BSS/CSP&lt;br /&gt;
i cosSinCSP. Kluczowa różnica: CSP szuka kierunków maksymalizujących&lt;br /&gt;
kontrast wariancji między warunkami (kryterium drugiego rzędu),&lt;br /&gt;
ICA szuka składowych niezależnych statystycznie, maksymalizując&lt;br /&gt;
niegaussowość (kryterium wyższego rzędu). ICA nie wymaga&lt;br /&gt;
dwóch warunków eksperymentalnych — działa na jednym stacjonarnym sygnale.&lt;br /&gt;
&lt;br /&gt;
;Zakres wykładu (~40 min):&lt;br /&gt;
* model generatywny ICA: &amp;lt;math&amp;gt;\mathbf{x} = \mathbf{D}\mathbf{s}&amp;lt;/math&amp;gt;, założenie niegaussowości składowych&lt;br /&gt;
* negoentropia i algorytm FastICA&lt;br /&gt;
* porównanie z CSP: kiedy ICA, kiedy CSP&lt;br /&gt;
* ograniczenia: liczba próbek a liczba kanałów (&amp;lt;math&amp;gt;kN^2&amp;lt;/math&amp;gt;),  niejednoznaczność kolejności i skali komponentów&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia (~80 min):&lt;br /&gt;
* wczytanie danych do EEGLAB, edycja lokalizacji elektrod&lt;br /&gt;
* filtrowanie górnoprzepustowe (FIR, 0,5 Hz), zmiana referencji&lt;br /&gt;
* obliczenie ICA na całym sygnale&lt;br /&gt;
* identyfikacja komponentów zawierających rytm alfa:  topografia, widmo, przebieg czasowy&lt;br /&gt;
* usunięcie komponentów niezawierających alfy,  odtworzenie sygnału na elektrodach&lt;br /&gt;
* porównanie wyników między co najmniej trzema uruchomieniami ICA:  czy komponenty są powtarzalne?&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ICA jako filtr przestrzenny|ICA jako filtr przestrzenny]]&lt;br /&gt;
i [[#ZADANIE: Wydobywanie interesujących komponentów|Wydobywanie interesujących komponentów]] poniżej.&lt;br /&gt;
==ICA jako filtr przestrzenny==&lt;br /&gt;
&lt;br /&gt;
===Definicja ===&lt;br /&gt;
Independent Component Analysis (ICA) jest metodą statystycznej analizy sygnałów, która dokonuje dekompozycji wielokanałowych zapisów na składowe niezależne w sensie statystycznym.&lt;br /&gt;
Dwie składowe ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; i ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; są niezależne jeżeli wiedza o wartości ''s''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; nie daje żadnych informacji o możliwych wartościach ''s''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. ICA może być wyrażona przez prosty model generatywny:&lt;br /&gt;
: '''x''' = '''Ds'''&lt;br /&gt;
: gdzie '''x''' = {''x''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''x''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''x''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest zmierzonym ''n'' kanałowym sygnałem, '''D''' jest macierzą mieszającą zaś '''s''' = {''s''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;, ''s''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, ..., ''s''&amp;lt;sup&amp;gt;''n''&amp;lt;/sup&amp;gt;} jest aktywnością ''n'' źródeł. Podstawowym założeniem dotyczącym '''s''' jest to, że ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; są statystycznie niezależne.  Aby wyestymować model musimy też założyć, że składowe mają niegaussowskie rozkłady wartości (Hyvärinen, 2000).&lt;br /&gt;
&lt;br /&gt;
Dodatkowo model ten zakłada następujące fakty:&lt;br /&gt;
# Sygnał jest liniową mieszaniną aktywności źródeł&lt;br /&gt;
# Sygnały pochodzące z każdego ze źródeł są niezależne od pozostałych&lt;br /&gt;
# Źródła oraz proces ich mieszania są stacjonarne, tzn, ich momenty statystyczne nie zależą od czasu&lt;br /&gt;
# Energie (wariancje) źródeł nie mogą być wyznaczone jednoznacznie. Dzieje się tak ponieważ pomnożenie amplitudy ''i''-tego źródła może być uzyskane poprzez przemnożenie albo ''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; albo przez przemnożenie ''i''-tej kolumny macierzy '''D'''.  Naturalnym rozwiązaniem tej niejednoznaczności jest wprowadzenie konwencji, że komponenty są normowane tak aby miały wariancję 1: E[(''s''&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;''2''&amp;lt;/sup&amp;gt;] = 1.&lt;br /&gt;
# Kolejność komponentów jest dowolna.  Bo jeśli w ten sam sposób zmienimy kolejność komponentów w '''s''' i kolumn w '''D''' to dostaniemy dokładnie ten sam sygnał '''x'''.&lt;br /&gt;
&lt;br /&gt;
Głównym wyzwaniem w analizie ICA jest estymacja macierzy mieszającej '''D'''. Gdy jest ona znana to komponenty mogą być wyliczone w następujący sposób:&lt;br /&gt;
: '''s''' = '''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;'''x'''&lt;br /&gt;
&lt;br /&gt;
=== Estymacja ===&lt;br /&gt;
Znalezienie niezależnych komponentów może być rozważane w świetle Centralnego Twierdzenia Granicznego jako poszukiwanie komponentów o możliwie nie gaussowskim rozkładzie.&lt;br /&gt;
Aby zrozumieć to podejście prześledźmy heurystykę zaproponowaną przez (Hyvärinen, 2000). &lt;br /&gt;
Dla prostoty załóżmy, że poszukiwane źródła niezależne mają identyczne rozkłady. &lt;br /&gt;
Zdefiniujmy &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że jeśli &lt;br /&gt;
&lt;br /&gt;
'''w''' &lt;br /&gt;
&lt;br /&gt;
jest jedną z kolumn macierzy &lt;br /&gt;
&lt;br /&gt;
'''D'''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
to ''y'' jest jednym z poszukiwanych komponentów.&lt;br /&gt;
Zamieniając zmienne &lt;br /&gt;
&lt;br /&gt;
'''z'''&amp;amp;nbsp;= '''D'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''w''' &lt;br /&gt;
&lt;br /&gt;
możemy napisać &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''Ds'''&amp;amp;nbsp;= '''z'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''s'''. &lt;br /&gt;
&lt;br /&gt;
Uwidacznia to fakt, że ''y'' jest liniową kombinacją składowych s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; z wagami danymi przez z&amp;lt;sub&amp;gt;''i''&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Z centralnego twierdzenia granicznego wynika, że suma niezależnych zmiennych losowych ma  bardziej gaussowski charakter niż każda z tych zmiennych osobno. &lt;br /&gt;
Liniowa kombinacja staje się najmniej gaussowska gdy '''z''' ma tylko jeden element niezerowy. W tym przypadku ''y'' jest proporcjonalny do s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;. &lt;br /&gt;
Zatem problem estymacji modelu ICA może być sformułowany jako problem znalezienia takiego wektora '''w''', który maksymalizuje niegaussowskość &lt;br /&gt;
&lt;br /&gt;
''y''&amp;amp;nbsp;= '''w'''&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;'''x'''. &lt;br /&gt;
&lt;br /&gt;
Maksymalizacja niegaussowskości ''y'' daje jeden niezależny komponent odpowiadający jednemu z 2''n'' maksimów (bo mamy s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt; i &amp;amp;minus;s&amp;lt;sup&amp;gt;''i''&amp;lt;/sup&amp;gt;) w krajobrazie optymalizacyjnym. Aby znaleźć wszystkie niezależne komponenty musimy znaleźć wszystkie maksima. Ponieważ komponenty są nieskorelowane, to poszukiwania kolejnych komponentów można kontynuować w podprzestrzeni ortogonalnej do już znalezionych komponentów.&lt;br /&gt;
&lt;br /&gt;
===Obliczenia===&lt;br /&gt;
Intuicyjna heurystyka poszukiwania najbardziej niegaussowskich składowych może być użyta do wyprowadzenia różnych funkcji kosztu, których optymalizacja daje model ICA, np. kurtoza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;kurt(y) = E\{y^4\} - 3(E{y^2})^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną miarą gassowskości jest neg-entropia, którą można wyprowadzić z entropii: &lt;br /&gt;
Entropia jest miarą średniego zdziwienia wynikiem obserwacji zmiennej losowej:&lt;br /&gt;
&amp;lt;math&amp;gt;H(Y) = - \sum_i P(Y= a_i) \log(P(Y=a_i)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Negentropia jest zdefiniowana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) = H(y_{gauss}) -H(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt; y_{gauss} &amp;lt;/math&amp;gt; jest gassuwską zmienną losową o takiej samej kowaiancji jak &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negentropia jest skomplikowana obliczeniow, więc w praktyce używana jest formuła przybliżona:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; J(y) \varpropto   [E\{G (y)\}  - E\{G(\nu)\}]^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\nu &amp;lt;/math&amp;gt; jest zmienną losową ze standardowego rozkładu normalnego , a G są pewnymi niekwadratowymi funkcjami.&lt;br /&gt;
&lt;br /&gt;
W algorytmie FastICA extremum negentropii jest znajdowane w procedurze bazującej na optymalizacji Newtona.&lt;br /&gt;
(szczegóły np.: sekcja 6 w https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedura wykorzystywana w eeglabie (&amp;amp;bdquo;runica&amp;amp;rdquo;, Makeig 1996) dąży do minimalizacji informacji wzajemnej. Oba podejścia są w przybliżeniu równoważne (Hyvärinen, 2000), chociaż owo przybliżenie dla  sygnałów elektrofizjologicznych nie zostało to jeszcze w pełni wyeksplorowane.&lt;br /&gt;
Dla sygnałów o niskiej wymiarowości i spełniających dokładnie założenia ICA wszystkie powszechnie wykorzystywane algorytmy dają niemal identyczne wyniki.&lt;br /&gt;
&lt;br /&gt;
;Bardzo ważna uwaga: ogólną zasadą jest, że jeśli estymujemy ''N'' stabilnych komponentów  (z ''N''-kanałowych danych) to musimy dysponować ''kN''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; punktami danych w każdym kanale, gdzie ''N''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; jest liczbą elementów w macierzy '''D''', którą ICA próbuje wyestymować, ''k'' jest liczbą całkowitą. Nie ma dobrych oszacowań teoretycznych na wielkość ''k'', z praktycznych obserwacji wynika, że rośnie ona z liczbą kanałów.&lt;br /&gt;
&lt;br /&gt;
=== Możliwe zastosowania ===&lt;br /&gt;
Najczęściej ICA jest stosowana jako narzędzie do:&lt;br /&gt;
* usuwania artefaktów z sygnałów EEG (ruchy oczu i mięśnie) &lt;br /&gt;
* wydobywania składowych do dalszej analizy (Onton, 2006)&lt;br /&gt;
* jako analiza wstępna do lokalizacji źródeł (Grau, 2007).&lt;br /&gt;
* ICA jest także stosowana w analize sygnałów EKG i EMG.&lt;br /&gt;
&lt;br /&gt;
===Bibliografia===&lt;br /&gt;
Bazowa praca:&lt;br /&gt;
* A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999 http://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99_reprint.pdf&lt;br /&gt;
&lt;br /&gt;
Nieco prościej opisana wersja z przykładami:&lt;br /&gt;
* Hyvärinen, A. and Oja, E. (2000). Independent component analysis: Algorithms and applications. Neural Networks, 13(4-5):411–430.&lt;br /&gt;
https://www.cs.helsinki.fi/u/ahyvarin/papers/NN00new.pdf&lt;br /&gt;
&lt;br /&gt;
* Grau, C., Fuentemilla, L., Marco-Pallars, J. (2007). Functional neural dynamics underlying auditory event-related n1 and n1 suppression response. Neuroimage, 36(6):522–31.&lt;br /&gt;
* Makeig, S., Bell, A., Jung, T.-P., Sejnowski,T. (1996). Independent component analysis of electroencephalographic data. W: Touretzky, D., Mozer, M., and Hasselmo, M., editors, Advances in Neural Information Processing Systems, volume 8, pages 145–151. MIT Press, Cambridge, MA.&lt;br /&gt;
* Onton, J., Makeig, S. (2006). Information-based modeling of event-related brain dynamics. Prog Brain Res., 159:99–120.&lt;br /&gt;
* Tutorial: http://sccn.ucsd.edu/wiki/Chapter_09:_Decomposing_Data_Using_ICA&lt;br /&gt;
* http://sccn.ucsd.edu/~arno/indexica.html&lt;br /&gt;
* http://cis.legacy.ics.tkk.fi/aapo/papers/IJCNN99_tutorialweb/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZADANIE: Wydobywanie interesujących komponentów ===&lt;br /&gt;
&lt;br /&gt;
Dane do tej części ćwiczeń proszę pobrać i rozpakować w swoim katalogu:&lt;br /&gt;
http://www.fuw.edu.pl/~jarekz/LabEEG/Dane_do_ICA_alfa.tar.gz&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu, w którym osoba badana siedziała z zamkniętymi oczami słuchając nagrania czytanego spokojnym głosem. Metadane opisujące sygnał znajdują się w pliku Miro.xml, zaś lokalizacje elektrod w pliku Miro-10-20-Cap.locs.&lt;br /&gt;
&lt;br /&gt;
Proszę:&lt;br /&gt;
* wczytać dane do eeglaba&lt;br /&gt;
* wyedytować lokalizację elektrod&lt;br /&gt;
* usunąć kanały nie zawierające EEG&lt;br /&gt;
* zmienić referencje na średnią z kanałów A1 i A2&lt;br /&gt;
* przefiltrować filtrem FIR górnoprzepustowym z częstością odcięcia 0,5 Hz&lt;br /&gt;
* obejrzeć wstępnie przygotowane dane&lt;br /&gt;
* policzyć ICA na całym sygnale &lt;br /&gt;
* obejrzeć właściwości otrzymanych komponentów&lt;br /&gt;
** Czy są wśród nich takie, które zawierają znaczny udział rytmu alfa?&lt;br /&gt;
** Jaka jest ich topografia?&lt;br /&gt;
* usunąć wszystkie komponenty nie zawierające alfy&lt;br /&gt;
* odtworzyć z tych komponentów sygnał na elektrodach&lt;br /&gt;
* wykonać dekompozycję ICA kilkukrotnie (co najmniej 3) i porównać wyniki&lt;br /&gt;
** Czy uzyskiwane komponenty są powtarzalne? &lt;br /&gt;
** Swoje wyniki porównać też z sąsiednimi grupami.&lt;br /&gt;
&lt;br /&gt;
=Sesja 6: ICA — artefakty i synteza metod=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~150 min (jedno spotkanie)&lt;br /&gt;
&lt;br /&gt;
Pierwsza część sesji poświęcona jest praktycznemu zastosowaniu ICA&lt;br /&gt;
do usuwania artefaktów z danych EEG przy użyciu automatycznych&lt;br /&gt;
klasyfikatorów komponentów (ICLabel, MARA). Druga część syntetyzuje&lt;br /&gt;
całość materiału z bloku filtrów przestrzennych: BSS/CSP, cosSinCSP&lt;br /&gt;
i ICA są trzema odpowiedziami na ten sam ogólny problem separacji&lt;br /&gt;
źródeł, różniącymi się założeniami i kryterium optymalizacji.&lt;br /&gt;
&lt;br /&gt;
;Zakres ćwiczenia — artefakty (~75 min):&lt;br /&gt;
* wczytanie danych Arousal do EEGLAB, usunięcie kanałów nieEEG&lt;br /&gt;
* obliczenie ICA, przegląd topografii komponentów&lt;br /&gt;
* identyfikacja artefaktów ocznych i mięśniowych przy użyciu wtyczek ICLabel i MARA&lt;br /&gt;
* porównanie sygnału przed i po usunięciu komponentów artefaktowych&lt;br /&gt;
&lt;br /&gt;
;Zakres syntezy (~45 min):&lt;br /&gt;
* tabela porównawcza CSP / cosSinCSP / ICA: założenia, dane wejściowe, kryterium optymalizacji, kiedy stosować&lt;br /&gt;
* związek filtrów przestrzennych z architekturami sieci neuronowych: warstwa depthwise conv w ShallowConvNet i EEGNet jako wyuczony odpowiednik macierzy W z CSP — szczegóły w [[#CSP a sieci neuronowe|CSP a sieci neuronowe]] poniżej&lt;br /&gt;
* omówienie raportów, pytania&lt;br /&gt;
&lt;br /&gt;
;Materiały:&lt;br /&gt;
Zob. [[#ZADANIE: Identyfikacja artefaktów|Identyfikacja artefaktów]] poniżej.&lt;br /&gt;
===ZADANIE: Identyfikacja artefaktów ===&lt;br /&gt;
Proszę pobrać dane:&lt;br /&gt;
&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal-10-20-Cap.locs&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.set&lt;br /&gt;
*http://www.fuw.edu.pl/~jarekz/LabEEG/Arousal1.fdt&lt;br /&gt;
&lt;br /&gt;
Pochodzą one z eksperymentu w którym osoba badana czytała słowa o różnych właściwościach wzbudzania emocji. &lt;br /&gt;
&lt;br /&gt;
* wczytaj je do eeglaba&lt;br /&gt;
* wczytaj lokalizację kanałów z pliku Arousal-10-20-Cap.locs&lt;br /&gt;
* obejrzyj przebiegi czasowe&lt;br /&gt;
* odrzuć kanał z diodą (21) i z GSR (20)&lt;br /&gt;
* zrób dekompozycję ICA&lt;br /&gt;
* obejrzyj topografię komponentów&lt;br /&gt;
* zidentyfikuj komponenty odpowiadające mruganiu i aktywności mięśniowej.&lt;br /&gt;
;UWAGA: Aktualnie do wykrywania komponentów artefaktowych warto posłużyć się wtyczkami do eeglaba dostępnymi przez stronę:&lt;br /&gt;
&lt;br /&gt;
https://sccn.ucsd.edu/eeglab/plugin_uploader/plugin_list_all.php&lt;br /&gt;
&lt;br /&gt;
* ICLabel&lt;br /&gt;
* MARA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sesja 7: Problem odwrotny w EEG i MEG=&lt;br /&gt;
&lt;br /&gt;
;Czas: ~60 min wykład + ~90 min ćwiczenie&lt;br /&gt;
&lt;br /&gt;
Sesja wprowadza problem odwrotny jako alternatywne — i komplementarne —&lt;br /&gt;
podejście do analizy przestrzennej sygnałów EEG i MEG. O ile BSS/CSP&lt;br /&gt;
i ICA szukają filtrów przestrzennych w przestrzeni elektrod,&lt;br /&gt;
nie zakładając nic o geometrii mózgu,&lt;br /&gt;
to metody problemu odwrotnego wyraźnie osadzają źródła&lt;br /&gt;
w przestrzeni trójwymiarowej, korzystając z fizyki i modelu głowy.&lt;br /&gt;
&lt;br /&gt;
Materiały z naszych zasobów: &lt;br /&gt;
* [[Elektroencefalografia|Sekcje 3 i 8 z Podręcznika o EEG ]]&lt;br /&gt;
* [https://drive.google.com/file/d/1EOJxN1y7X3YlIFHoIIyoZzCiXdrQSHcA Wykład Piotra Durki z Analizy sygnałów o problemie odwrotnym w EEG iMEG]&lt;br /&gt;
&lt;br /&gt;
Z zasobów zewnętrznych polecam:&lt;br /&gt;
* [https://download.fieldtriptoolbox.org/workshop/toolkit2025/slides/04_forward_inverse.pdf#page=1.00 Slajdy &amp;quot;Forward and inverse - lecture by Robert Oostenveld&amp;quot; fragment warsztatów: &amp;quot;Advanced MEG/EEG toolkit at the Donders&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kontrast z BSS: dwa języki opisu tego samego zjawiska==&lt;br /&gt;
&lt;br /&gt;
Zarówno BSS/ICA, jak i metody problemu odwrotnego wychodzą&lt;br /&gt;
od tego samego modelu generatywnego:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{A}\,\mathbf{s}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{x}(t) \in \mathbb{R}^{N_e}&amp;lt;/math&amp;gt; to potencjały na elektrodach,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{s}(t) \in \mathbb{R}^{N_s}&amp;lt;/math&amp;gt; to aktywność źródeł,&lt;br /&gt;
a &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt; to macierz mieszająca (ang. ''lead field'' lub ''forward matrix'').&lt;br /&gt;
&lt;br /&gt;
Różnica leży w tym, co robimy z macierzą &amp;lt;math&amp;gt;\mathbf{A}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! BSS / ICA !! Problem odwrotny&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz A''' || nieznana; estymowana z danych || obliczona z modelu głowy (''forward model'')&lt;br /&gt;
|-&lt;br /&gt;
| '''Liczba źródeł''' || równa liczbie elektrod || od 1 dipola do ~10&amp;amp;thinsp;000 wokseli&lt;br /&gt;
|-&lt;br /&gt;
| '''Geometria''' || brak założeń przestrzennych || źródła zlokalizowane w przestrzeni 3D&lt;br /&gt;
|-&lt;br /&gt;
| '''Regularyzacja''' || przez kryterium stat. (niezależność, wariancja) || przez regularyzację matematyczną (L2, L1, …)&lt;br /&gt;
|-&lt;br /&gt;
| '''Wynik''' || filtry przestrzenne + komponenty || mapa aktywności w przestrzeni mózgu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa trudność problemu odwrotnego wynika z jego&lt;br /&gt;
fundamentalnej niejednoznaczności: &lt;br /&gt;
&lt;br /&gt;
układ równań:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x} = \mathbf{A}\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest niedookreślony — przy &amp;lt;math&amp;gt;N_e \approx 19\text{–}256&amp;lt;/math&amp;gt; elektrodach&lt;br /&gt;
i &amp;lt;math&amp;gt;N_s \sim 10^4&amp;lt;/math&amp;gt; możliwych lokalizacjach źródeł&lt;br /&gt;
istnieje nieskończenie wiele rozkładów &amp;lt;math&amp;gt;\mathbf{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
dokładnie odtwarzających zmierzony &amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Każda metoda nakłada inne założenie ''a priori'', by wybrać jedno rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
==Model do przodu (forward model)==&lt;br /&gt;
&lt;br /&gt;
Zanim można rozwiązać problem odwrotny, należy zbudować&lt;br /&gt;
''model do przodu'' — obliczenie potencjałów na elektrodach&lt;br /&gt;
wywołanych przez jednostkowe źródło prądowe w danym miejscu mózgu.&lt;br /&gt;
Wynik zapisuje się jako macierz ''pola wiodącego'' (''lead field''):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{A} \in \mathbb{R}^{N_e \times 3N_s}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie czynnik 3 wynika z trzech ortogonalnych składowych momentu dipolowego.&lt;br /&gt;
&lt;br /&gt;
;Modele geometrii głowy:&lt;br /&gt;
* '''sferyczny''' — analityczny, szybki, niedokładny; przydatny do testów i dydaktyki&lt;br /&gt;
* '''BEM''' (''Boundary Element Method'') — trójwarstwowy model skóry/czaszki/mózgu z siatką trójkątów; standard dla EEG&lt;br /&gt;
* '''FEM''' (''Finite Element Method'') — uwzględnia anizotropię białej istoty mózgowej; wymagany dla MEG i zaawansowanych zastosowań klinicznych&lt;br /&gt;
&lt;br /&gt;
;Programy obliczające model do przodu:&lt;br /&gt;
MNE-Python (&amp;lt;code&amp;gt;mne.make_bem_model&amp;lt;/code&amp;gt;), FieldTrip (&amp;lt;code&amp;gt;ft_prepare_headmodel&amp;lt;/code&amp;gt;), OpenMEEG.&lt;br /&gt;
&lt;br /&gt;
==Fitowanie dipoli (Dipole Fitting)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Najprostsze założenie: aktywacja EEG pochodzi z jednego&lt;br /&gt;
(lub kilku) ekwiwalentnych dipoli prądowych.&lt;br /&gt;
Każdy dipol opisany jest sześcioma parametrami:&lt;br /&gt;
trzema współrzędnymi położenia &amp;lt;math&amp;gt;(x,y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
i trzema składowymi momentu dipolowego &amp;lt;math&amp;gt;(q_x, q_y, q_z)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Dla pojedynczego dipola o momencie &amp;lt;math&amp;gt;\mathbf{q}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{x}(t) = \mathbf{a}(\mathbf{r}_0)\,\mathbf{q}(t) + \boldsymbol{\varepsilon}(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r}_0) \in \mathbb{R}^{N_e \times 3}&amp;lt;/math&amp;gt;&lt;br /&gt;
to kolumna macierzy pola wiodącego odpowiadająca lokalizacji &amp;lt;math&amp;gt;\mathbf{r}_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Estymacja polega na minimalizacji reszty:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{r}}_0 = \arg\min_{\mathbf{r}} \left\|\mathbf{x}(t) - \mathbf{a}(\mathbf{r})\,\hat{\mathbf{q}}(t)\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Minimalizację prowadzi się zwykle algorytmem Neldera–Meada&lt;br /&gt;
lub Levenberga–Marquardta po przestrzeni lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy źródło jest punktowe lub quasi-punktowe (np. wczesne składowe słuchowych potencjałów wywołanych N20, P25)&lt;br /&gt;
* gdy liczba aktywnych źródeł jest z góry znana i mała (1–3 dipole)&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* wrażliwość na punkt startowy — algorytm może utknąć w minimum lokalnym&lt;br /&gt;
* złe dopasowanie gdy aktywacja pochodzi z rozległego obszaru kory&lt;br /&gt;
* wynik silnie zależy od dokładności modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Minimum Norm Estimation (MNE)==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Zamiast zakładać małą liczbę dipoli,&lt;br /&gt;
rozkładamy aktywność na gęstą siatkę źródeł pokrywającą całą powierzchnię kory&lt;br /&gt;
i szukamy rozwiązania o minimalnej normie —&lt;br /&gt;
tj. takiego, które odtwarza dane, angażując jak najmniejszą całkowitą energię źródeł.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Problem optymalizacji z regularyzacją Tichonowa:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \arg\min_{\mathbf{s}} \left\|\mathbf{x} - \mathbf{A}\mathbf{s}\right\|^2 + \lambda\left\|\mathbf{s}\right\|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt; to parametr regularyzacji kontrolujący kompromis&lt;br /&gt;
między wiernością danym a gładkością rozwiązania.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat{\mathbf{s}} = \mathbf{A}^T\left(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I}\right)^{-1}\mathbf{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;\mathbf{W}_{\mathrm{MNE}} = \mathbf{A}^T(\mathbf{A}\mathbf{A}^T + \lambda\mathbf{I})^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
jest liniowym filtrem przestrzennym — analogiem macierzy &amp;lt;math&amp;gt;\mathbf{W}&amp;lt;/math&amp;gt; z CSP,&lt;br /&gt;
lecz skonstruowanym na podstawie modelu do przodu, nie z danych.&lt;br /&gt;
&lt;br /&gt;
===Warianty===&lt;br /&gt;
&lt;br /&gt;
;dSPM (''dynamic Statistical Parametric Mapping'', Dale 2000):&lt;br /&gt;
Normalizuje estymowaną aktywność przez odchylenie standardowe szumu:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{dSPM}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sigma_{\mathrm{noise}}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wynik ma interpretację statystyczną (wartość F lub Z); popularne w neurobiologii poznawczej.&lt;br /&gt;
&lt;br /&gt;
;sLORETA (''standardized LORETA'', Pascual-Marqui 2002):&lt;br /&gt;
Normalizuje przez odchylenie standardowe samego estymatora MNE (nie tylko szumu):&lt;br /&gt;
:&amp;lt;math&amp;gt;F_{\mathrm{sLORETA}}(\mathbf{r}, t) = \frac{\hat{s}(\mathbf{r},t)}{\sqrt{\left[\mathbf{W}_{\mathrm{MNE}}\mathbf{A}\right]_{(\mathbf{r},\mathbf{r})}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wykazuje zerowe systematyczne błędy lokalizacji w warunkach idealnych.&lt;br /&gt;
&lt;br /&gt;
;Wybór &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;:&lt;br /&gt;
Zwykle &amp;lt;math&amp;gt;\lambda = \alpha \cdot \mathrm{tr}(\mathbf{A}\mathbf{A}^T) / \mathrm{tr}(\mathbf{I})&amp;lt;/math&amp;gt;&lt;br /&gt;
z &amp;lt;math&amp;gt;\alpha \in [0.05, 0.3]&amp;lt;/math&amp;gt;; w MNE-Python domyślnie &amp;lt;math&amp;gt;\alpha = 0.1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Można też stosować kryterium L-krzywej lub walidację krzyżową.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* gdy aktywacja jest rozproszona lub nieznana a priori&lt;br /&gt;
* jako ogólne narzędzie wizualizacji ERP na powierzchni kory&lt;br /&gt;
* przy małej liczbie elektrod&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* tendencja do rozmywania rozwiązania — źródła głębokie są systematycznie niedoszacowane&lt;br /&gt;
* brak zakładanej rzadkości (''sparsity''); wariant L1 (MCE) jest rzadszy, ale trudniejszy obliczeniowo&lt;br /&gt;
* wymaga dobrego modelu do przodu&lt;br /&gt;
&lt;br /&gt;
==Beamformery==&lt;br /&gt;
&lt;br /&gt;
===Idea===&lt;br /&gt;
Beamformer (dosł. „formowanie wiązki&amp;quot;) to adaptacyjny filtr przestrzenny,&lt;br /&gt;
który dla każdej lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
konstruuje wagi &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt; maksymalizujące&lt;br /&gt;
stosunek mocy sygnału z tej lokalizacji do mocy wszystkich pozostałych źródeł.&lt;br /&gt;
W odróżnieniu od MNE, beamformer korzysta z macierzy kowariancji danych —&lt;br /&gt;
jest więc metodą adaptacyjną, zbliżoną duchem do CSP.&lt;br /&gt;
&lt;br /&gt;
===LCMV (''Linearly Constrained Minimum Variance'', Van Veen 1997)===&lt;br /&gt;
&lt;br /&gt;
Szukamy filtra minimalizującego wariancję wyjścia&lt;br /&gt;
przy ograniczeniu zachowującym sygnał z lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}^*(\mathbf{r}) = \arg\min_{\mathbf{w}} \mathbf{w}^T\mathbf{C}\mathbf{w}&lt;br /&gt;
\quad \text{p.o.} \quad \mathbf{w}^T\mathbf{a}(\mathbf{r}) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\mathbf{C} = E[\mathbf{x}\mathbf{x}^T]&amp;lt;/math&amp;gt; to macierz kowariancji danych.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie analityczne (mnożnik Lagrange'a):&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r}) = \frac{\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc w lokalizacji &amp;lt;math&amp;gt;\mathbf{r}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\mathbf{r}) = \mathbf{w}(\mathbf{r})^T\mathbf{C}\,\mathbf{w}(\mathbf{r})&lt;br /&gt;
= \frac{1}{\mathbf{a}(\mathbf{r})^T\mathbf{C}^{-1}\mathbf{a}(\mathbf{r})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DICS (''Dynamic Imaging of Coherent Sources'', Gross 2001)===&lt;br /&gt;
&lt;br /&gt;
Wariant beamformera dla analizy częstotliwościowej:&lt;br /&gt;
zamiast macierzy kowariancji czasowej stosuje&lt;br /&gt;
''cross-spectral density matrix'' &amp;lt;math&amp;gt;\mathbf{C}(f)&amp;lt;/math&amp;gt;&lt;br /&gt;
obliczoną dla wybranego pasma częstości.&lt;br /&gt;
Pozwala mapować koherencję między lokalizacjami na powierzchni kory.&lt;br /&gt;
&lt;br /&gt;
===Analogia z CSP===&lt;br /&gt;
&lt;br /&gt;
Zauważmy analogię strukturalną:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! CSP !! LCMV Beamformer&lt;br /&gt;
|-&lt;br /&gt;
| '''Macierz kowariancji''' || &amp;lt;math&amp;gt;\mathbf{R}_T, \mathbf{R}_{NT}&amp;lt;/math&amp;gt; (dwa warunki) || &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; (jeden warunek) + &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filtr''' || &amp;lt;math&amp;gt;\mathbf{w}&amp;lt;/math&amp;gt;: maks. stosunek wariancji || &amp;lt;math&amp;gt;\mathbf{w}(\mathbf{r})&amp;lt;/math&amp;gt;: min. wariancja przy ograniczeniu&lt;br /&gt;
|-&lt;br /&gt;
| '''Przestrzeń''' || elektrod || przestrzeni mózgu (woksel po wokselu)&lt;br /&gt;
|-&lt;br /&gt;
| '''Model do przodu''' || nie || tak — przez &amp;lt;math&amp;gt;\mathbf{a}(\mathbf{r})&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kluczowa różnica: CSP optymalizuje globalnie jednym zagadnieniem własnym,&lt;br /&gt;
beamformer rozwiązuje osobny problem dla każdej lokalizacji.&lt;br /&gt;
&lt;br /&gt;
===Zastosowania i ograniczenia===&lt;br /&gt;
;Kiedy stosować:&lt;br /&gt;
* analiza ERD/ERS (rytmy ruchowe, alfa, beta) w przestrzeni mózgu&lt;br /&gt;
* lokalizacja źródeł oscylacyjnych w MEG&lt;br /&gt;
* DICS do badania koherencji korowo-korowej&lt;br /&gt;
&lt;br /&gt;
;Ograniczenia:&lt;br /&gt;
* silnie skorelowane źródła są tłumione (''source cancellation'') — beamformer zakłada, że źródła są niekorelowane&lt;br /&gt;
* wymaga dużej liczby próbek do stabilnej estymacji &amp;lt;math&amp;gt;\mathbf{C}^{-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* przy małej liczbie elektrod macierz &amp;lt;math&amp;gt;\mathbf{C}&amp;lt;/math&amp;gt; może być źle uwarunkowana&lt;br /&gt;
&lt;br /&gt;
;Podsumowanie:&lt;br /&gt;
[[Plik:Inverse problem vs bss.png|mały|centruj]]&lt;br /&gt;
&lt;br /&gt;
==Podsumowanie: kiedy stosować którą metodę==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Metoda !! Założenie a priori !! Dane wejściowe !! Typowe zastosowanie&lt;br /&gt;
|-&lt;br /&gt;
| '''Dipole fitting''' || 1–3 punktowe źródła || ERP, AEP, SEP || lokalizacja wczesnych składowych wywołanych&lt;br /&gt;
|-&lt;br /&gt;
| '''MNE / dSPM / sLORETA''' || minimalna energia; źródła ciągłe || ERP, dowolny sygnał || wizualizacja rozproszonej aktywności na korze&lt;br /&gt;
|-&lt;br /&gt;
| '''LCMV Beamformer''' || źródła niekorelowane || ERD/ERS, dane resting-state || lokalizacja źródeł oscylacyjnych w MEG/EEG&lt;br /&gt;
|-&lt;br /&gt;
| '''DICS''' || j.w. + analiza spektralna || dane oscylacyjne || mapa koherencji korowo-korowej&lt;br /&gt;
|-&lt;br /&gt;
| '''CSP / ICA''' || brak modelu geometrycznego || dwa warunki / jeden segment || klasyfikacja BCI, usuwanie artefaktów&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Uwaga praktyczna:&lt;br /&gt;
Wszystkie metody problemu odwrotnego wymagają przygotowania modelu do przodu.&lt;br /&gt;
Zaleca się korzystanie z MNE-Python lub FieldTrip — oba pakiety&lt;br /&gt;
oferują spójne pipeline'y od surowych danych do map korowych&lt;br /&gt;
i są szeroko stosowane w literaturze, co ułatwia replikację wyników.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====W raporcie: ====&lt;br /&gt;
* zaprezentuj fragmenty sygnału zawierającego artefakty oczne i mięśniowe przed i po zastosowaniu czyszczenia poprzez usuwanie komponentów zdominowanych przez artefakty. &lt;br /&gt;
* zaprezentuj topografię i przebiegi czasowe komponentów zidentyfikowanych jako artefakty oczne i mięśniowe. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne dla większej ilości warunków==&lt;br /&gt;
===FFDIAG===&lt;br /&gt;
===Analiza ERD/S z użyciem FFDIAG===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!---&lt;br /&gt;
==Eksperyment ASSR==&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
===Rejestracja sygnału===&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
===Analiza===&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową (odcinki podczas stymulacji oraz bez niej).&lt;br /&gt;
# Dla każdej realizacji (odpowiedniego typu) obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz i czy jest różnica między odcinkami ze stymulacją i bez niej.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę opisaną powyżej.&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
STARA WERSJA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=Prezentacja=&lt;br /&gt;
[https://brain.fuw.edu.pl/edu/images/2/2f/BSS.pdf slajdy z prezentacji]&lt;br /&gt;
&lt;br /&gt;
=Ślepa separacja źródeł (BSS)=&lt;br /&gt;
{{hidden begin|title=Wstęp teoretyczny do BSS}}&lt;br /&gt;
Rozważmy ''N''-kanałowy sygnał EEG.&lt;br /&gt;
Próbkę tego sygnału możemy przedstawić jako punkt w przestrzeni rozpiętej przez osie, z których każda reprezentuje wartość potencjału w jednym kanale. Cały sygnał tworzy w tej przestrzeni chmurę punktów. Rozciągłość tej chmury w danym kierunku mówi nam o wariancji (zmienności) sygnału w tym kierunku. &lt;br /&gt;
&lt;br /&gt;
Taki zbiór punktów wygodniej jest analizować w układzie współrzędnych zgodnym z osiami głównymi macierzy kowariancji.&lt;br /&gt;
W dalszej części rozważań założymy, że te przestrzenie, w których rozważamy sygnały są przestrzeniami wektorowymi, a pojedyncze próbki wielokanałowego sygnału są wektorami. &lt;br /&gt;
[[Plik:Kowariancja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Filtry przestrzenne i ślepa separacja źródeł==&lt;br /&gt;
Sygnał EEG jest superpozycją aktywności elektrycznej wielu źródeł.&lt;br /&gt;
Jak można estymować aktywność samych źródeł?&lt;br /&gt;
[[Plik:Mieszanie.png|200px|center]]&lt;br /&gt;
Niech:&lt;br /&gt;
: &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; - aktywność niezależnych źródeł,&lt;br /&gt;
: &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; mierzony sygnał&lt;br /&gt;
: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; macierz przejścia taka, że:&lt;br /&gt;
::&amp;lt;math&amp;gt;x(t) = A s(t)&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = A^{-1}x(t) = P x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Macierz kowariancji dla sygnałów &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; estymujemy tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x(t)x(t)^T]&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając (*) mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; C_x = E[x x^T] = E[As(As)^T] = A E[s s^T] A^T = A C_s A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
Z założenia, że źródła są niezależne wynika, że macierz &amp;lt;math&amp;gt;C_s&amp;lt;/math&amp;gt; jest diagonalna.&lt;br /&gt;
Przekształcając powyższe równanie możemy zapisać:&lt;br /&gt;
:&amp;lt;math&amp;gt;A^{-1} C_x (A^T)^{-1} = P C_x P^T = C_s&amp;lt;/math&amp;gt;&lt;br /&gt;
Odwzorowanie &amp;lt;math&amp;gt;P = A^{-1}&amp;lt;/math&amp;gt; diagonalizuje macierz &amp;lt;math&amp;gt;C_x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powyższe rozumowanie jest słuszne w przypadku gdy mamy do czynienia z sygnałem stacjonarnym, tzn. jego macierz kowariancji jest niezależna od czasu, czyli przez cały czas aktywna jest ta sama konfiguracja źródeł niezależnych.&lt;br /&gt;
W przypadku gdy tak nie jest to konstrukcję filtra przestrzennego można oprzeć o  jednoczesną diagonalizację macierzy kowariancji odpowiadających różnym stanom osoby badanej.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Diagonalizacja.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
==Common Spatial Pattern ==&lt;br /&gt;
===Koncepcja===&lt;br /&gt;
Dla ustalenia uwagi możemy myśleć o eksperymencie wywołującym potencjał P300. Mamy w nim dwie sytuacje eksperymentalne. Oznaczmy &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (target) próby, w których pojawił się oczekiwany bodziec, zaś  &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; (non-target) gdy pojawił się bodziec standardowy.&lt;br /&gt;
Chcielibyśmy znaleźć taki montaż (czyli taką kombinację liniową kanałów), który maksymalizuje stosunek mocy (wariancji) sygnałów rejestrowanych w dwóch rożnych warunkach eksperymentalnych.&lt;br /&gt;
&lt;br /&gt;
===Formalizm===&lt;br /&gt;
Metoda ta polega na znalezieniu takiego kierunku &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; w przestrzeni sygnałów, że sygnał z warunku &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; rzutowany na ten kierunek ma dużą wariancje a sygnał z warunku &amp;lt;math&amp;gt;NT&amp;lt;/math&amp;gt; ma wariancję małą. &lt;br /&gt;
&lt;br /&gt;
Rzutowanie sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; na kierunek &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; odbywa się przez policzenie iloczynu skalarnego dla każdej chwili czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt; s_w(t) = w^T x(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Wariancja tego rzutowanego sygnału to:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathrm{var}(s_w) = E[s_w s_w^T] = E[ w^T x (w^T x)^T] = w^T E[x x^T] w = w^T C_x w &amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem znalezienie właściwego kierunku rzutowania można wyrazić jako szukanie maksimum wyrażenia &amp;lt;math&amp;gt; J(w) &amp;lt;/math&amp;gt; (jest to tzw. iloraz Rayleigha):&lt;br /&gt;
: &amp;lt;math&amp;gt;J(w) = \frac{w^T C_T w}{w^T C_{NT} w}  &amp;lt;/math&amp;gt;&lt;br /&gt;
Ekstremum tego ilorazu można znaleźć poprzez policzenie gradientu &amp;lt;math&amp;gt;J(w)&amp;lt;/math&amp;gt; i przyrównanie go do zera:&lt;br /&gt;
:&amp;lt;math&amp;gt; \nabla J(w) =  \frac{ 2 C_{T} w \left(w^T  C_{NT} w\right)  -2C_{NT} w \left(w^T  C_{T} w \right)}{\left(w^T  C_{NT} w\right)^2} = \frac{   2}{w^T  C_{NT} w}\left[     C_{T}w  -\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
Przyrównując to wyrażenie do zera dostajemy do rozwiązania tzw. uogólnione zagadnienie własne:&lt;br /&gt;
:&amp;lt;math&amp;gt;       C_{T}w  =\frac{w^T  C_{T} w}{w^T  C_{NT} w}   C_{NT} w   &amp;lt;/math&amp;gt;&lt;br /&gt;
We wzorze tym liczba &amp;lt;math&amp;gt;\lambda=\frac{w^T  C_{T} w}{w^T  C_{NT} w}&amp;lt;/math&amp;gt; spełniająca to równanie jest uogólnioną wartością własną, wtedy &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; jest uogólnionym wektorem własnym odpowiadającym tej wartości. &lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt; \lambda&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; możemy wykorzystać w Matlabie funkcję &amp;lt;tt&amp;gt;eig&amp;lt;/tt&amp;gt;. Funkcja ta rozwiązuje (również) uogólnione zagadnienia własne postaci ''Aw''=&amp;amp;lambda;''Bw'' dostarczając w wyniku macierz wektorów własnych (w kolumnach) oraz macierz zawierającą na przekątnej odpowiadające im wartości własne.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Odwzorowanie to można przedstawić w postaci macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, której każdy wiersz zawiera wagi dla odpowiednich kanałów. &lt;br /&gt;
Macierz zawierająca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt; &lt;br /&gt;
ma wymiary &amp;lt;math&amp;gt;C \times  N&amp;lt;/math&amp;gt;, gdzie &lt;br /&gt;
&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to liczba kanałów EEG, natomiast &lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; to liczba próbek dla każdego z kanałów. &lt;br /&gt;
Macierz &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; przekształca sygnał &amp;lt;math&amp;gt;X^{\pm}(t)&amp;lt;/math&amp;gt;  zgodnie ze wzorem:&lt;br /&gt;
:&amp;lt;math&amp;gt;X^{\pm}_{CSP}(t)=P^T  X^{\pm}(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Załóżmy dalej, że sygnały &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są generowane przez niezależne procesy stochastyczne, tzn. spełnione są następujące warunki. &lt;br /&gt;
# Syganły &amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt; są niezależne.&lt;br /&gt;
# Brak korelacji pomiędzy kanałami w sygnałach&amp;lt;math&amp;gt;X^{+}_{CSP} (t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X^{-}_{CSP} (t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Przynajmniej dla jednego z kanałów wariancja przetransformowanego sygnału jest maksymalna przy wystąpieniu bodźca i minimalna przy jego braku.&lt;br /&gt;
Po przemnożeniu równania 2.3 przez &amp;lt;math&amp;gt;(X^{\pm}_{CSP} (t))^T&amp;lt;/math&amp;gt; otrzymamy macierz kowariancji przetransformowanych sygnałów uśrednioną po realizacjach:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{\pm}_{CSP} (t) = X^{\pm}_{CSP} (t)(X^{\pm}_{CSP} (t))^T = P^T X^{\pm} (t) (X^{\pm}(t))^T P = P^T R^{\pm}P&amp;lt;/math&amp;gt;  (2.4)&lt;br /&gt;
Gdzie &amp;lt;math&amp;gt;R^{\pm}&amp;lt;/math&amp;gt; to macierz kowariancji sygnału uśredniona po realizacjach. Z warunków 1 i 2 wynika, że macierze &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; muszą być diagonalne, natomiast z warunku 3, że ich suma daje macierz jednostkową:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+}_{CSP} + R^{-}_{CSP} = 1 &amp;lt;/math&amp;gt;  (2.5)&lt;br /&gt;
Tak więc suma par diagonalnych wartości (&amp;lt;math&amp;gt;k^{+}_{i}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;k^{-}_{i}&amp;lt;/math&amp;gt;) w macierzach &amp;lt;math&amp;gt;R^{+}_{CSP}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;R^{-}_{CSP}&amp;lt;/math&amp;gt; musi być równa 1.&lt;br /&gt;
Korzystając z równania 2.5 wartości na przekątnej można również zapisać za pomocą wzoru:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{+}_{i} = \vec{p}^{T}_{i} R^{+} \vec{p}_{i}    &amp;lt;/math&amp;gt; (2.6)&lt;br /&gt;
:&amp;lt;math&amp;gt;k^{-}_{i} = \vec{p}^T_{i} R^{-}\vec{p}_{i} &amp;lt;/math&amp;gt; (2.7)&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\vec{p}_{i}&amp;lt;/math&amp;gt; to kolumnowy wektor macierzy &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Po przekształceniach ilorazu równań 2.6 i 2.7 można&lt;br /&gt;
otrzymać równanie:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R^{+} \vec{p}_{i} = \frac{k^{+}_{i}}{k^{-}_{i}} R^{-} \vec{p}_{i} &amp;lt;/math&amp;gt;  (2.8)&lt;br /&gt;
￼&lt;br /&gt;
Równanie to przedstawia ogólną formę zagadnienia wartości własnych. Takie przedstawienie problemu umożliwia zastosowanie do jego rozwiązania wydajnych metod algebraicznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wektor własny &amp;lt;math&amp;gt;\vec{p}_i&amp;lt;/math&amp;gt; jest interpretowany jako filtr przestrzenny. Dzięki transformacie &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; sygnał zostaje przeniesiony do przestrzeni, dla której różnica wariancji dla poszczególnych klas jest największa. Zgodnie z równaniem 2.5 najbardziej różniące się od siebie kanały są skorelowane z największą wartością własną &amp;lt;math&amp;gt;k^{+}&amp;lt;/math&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Zastosowanie filtra CSP do detekcji potencjału P300==&lt;br /&gt;
{{hidden begin|title=Eksperyment}}&lt;br /&gt;
===Eksperyment===&lt;br /&gt;
* Proszę zapoznać się z instrukcją: http://laboratorium-eeg.braintech.pl/rozdz10.html&lt;br /&gt;
* Proszę wczytać i uruchomić (na sucho) demo Demos-&amp;gt;EEG_P300wz&lt;br /&gt;
* Wspólne omówienie konstrukcji i potencjalnych modyfikacji tego scenariusza &lt;br /&gt;
&lt;br /&gt;
====Przygotowanie do badania:====&lt;br /&gt;
* założyć czepek z elektrodami w systemie 10-20;&lt;br /&gt;
* elektrody referencyjne: M1 i M2;&lt;br /&gt;
* elektroda GND w pozycji AFz.&lt;br /&gt;
&lt;br /&gt;
====Przygotowanie scenariuszy obci ====&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci srv&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w terminalu uruchomić &amp;lt;tt&amp;gt;obci_gui --preset brain2013&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* w interfejsie GUI zapisujemy scenariusze do własnego katalogu np &amp;amp;bdquo;P300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Signal (with ID)&amp;amp;rdquo; jako np. &amp;amp;bdquo;Sygnal&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain2013 Calibration p300&amp;amp;rdquo; jako &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;&lt;br /&gt;
** &amp;amp;bdquo;P-Brain 2013 p300&amp;amp;rdquo; jako &amp;amp;bdquo;Labirynt&amp;amp;rdquo;&lt;br /&gt;
* w przeglądarce plików otwórz katalog ~/.obci/scenarios/P300. Powinien on zawierać pliki: Sygnal.ini, kalibracjaP300.ini, Labirynt.ini oraz katalogi  Sygnal_configs, kalibracjaP300_configs, Labirynt_configs.&lt;br /&gt;
*  edytujemy parametry peerów.&lt;br /&gt;
** z katalogu ~/.obci/scenarios/P300/Sygnal_configs kopiujemy plik amplifier.ini do katalogu ~/.obci/scenarios/P300 jako global_amplifier.ini. To pozwoli nam zmieniać ustawienia wzmacniacza dla wszystkich scenariuszy jednocześnie.&lt;br /&gt;
** w naszych scenariuszach zapisanych w plikach Sygnal.ini, kalibracjaP300.ini, Labirynt.ini podmieniamy ścieżkę &amp;lt;tt&amp;gt;config =&amp;lt;/tt&amp;gt; w sekcji &amp;lt;tt&amp;gt;[peers.amplifier]&amp;lt;/tt&amp;gt; tak, aby pokazywała na ten skopiowany plik global_amplifier.ini&lt;br /&gt;
** w tym pliku global_amplifier.ini podmieniamy linijki (tak aby były to listy faktycznie wykorzystywanych kanałów) z:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;active_channels&amp;lt;/tt&amp;gt;&lt;br /&gt;
*** &amp;lt;tt&amp;gt;channel_names&amp;lt;/tt&amp;gt;&lt;br /&gt;
** dodajemy też linijkę: &amp;lt;tt&amp;gt;sampling_rate = 256&amp;lt;/tt&amp;gt;&lt;br /&gt;
* wchodzimy po kolei do katalogów: Sygnal_configs, kalibracjaP300_configs, Labirynt_configs i odnajdujemy plik switch_backup.ini. W tym pliku ustawiamy parametr &amp;lt;tt&amp;gt;new_scenario&amp;lt;/tt&amp;gt; na pusty. To spowoduje, że scenariusze te nie będą uruchamiać kolejnych scenariuszy po zakończeniu działania.&lt;br /&gt;
** edytujemy plik ~/.obci/scenarios/P300/kalibracjaP300_configs/clasifier.ini &lt;br /&gt;
*** zmieniamy linię&lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;ignore_channels = DriverSaw;AmpSaw;A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
::* oraz linię:&lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = PO7;PO8&amp;lt;/tt&amp;gt;&lt;br /&gt;
::: na &lt;br /&gt;
::: &amp;lt;tt&amp;gt;montage_channels = A1;A2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przeprowadzenie badania:====&lt;br /&gt;
# Uruchom scenariusz &amp;amp;bdquo;Sygnał&amp;amp;rdquo;.&lt;br /&gt;
# Tworzy on w katalogu domowym plik o nazwie &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy Svaroga z terminala poleceniem &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;. W zakładce sygnały on-line odnajdujemy nazwę naszego scenariusza &amp;amp;bdquo;Sygnal&amp;amp;rdquo;. Podłączamy się do niego i poprawiamy ewentualnie źle kontaktujące elektrody.&lt;br /&gt;
# Jak już jesteśmy zadowoleni z jakości sygnału to zatrzymujemy scenariusz &amp;amp;bdquo;Sygnal&amp;amp;rdquo; w obci.&lt;br /&gt;
# W pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt;  znajduje się string, który stanowi rdzeń do tworzenia nazw plików, z których korzystają nasze scenariusze. Proszę zmienić ten string np. na: &amp;lt;tt&amp;gt;test1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Uruchamiamy scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Badany będzie oglądał interfejs z trzema literami A B C migającymi w losowej kolejności. Zadaniem jest zliczanie mignięć litery B.&lt;br /&gt;
# Po zakończeniu kalibracji uruchamiamy scenariusz &amp;amp;bdquo;Labirynt&amp;amp;rdquo;.&lt;br /&gt;
# Danych z kalibracji potrzebować będziemy kilka zestawów.  Proszę powtórzyć kilkukrotnie scenariusz &amp;amp;bdquo;kalibracjaP300&amp;amp;rdquo;. Przed każdym uruchomieniem trzeba zmienić string w pliku &amp;lt;tt&amp;gt;file_id_name&amp;lt;/tt&amp;gt; np. na &amp;lt;tt&amp;gt;test???&amp;lt;/tt&amp;gt; gdzie &amp;lt;tt&amp;gt;???&amp;lt;/tt&amp;gt; oznacza kolejne numery.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===SSVEP-BCI===&lt;br /&gt;
W zajęciach tych przydadzą nam się informacje z:&lt;br /&gt;
https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online&lt;br /&gt;
====Wstęp====&lt;br /&gt;
Naszym celem będzie stworzenie prostego interfejsu wykorzystującego zjawisko SSVEP. &lt;br /&gt;
Po dwóch stronach monitora zamocujemy diody. Każda będzie migać ze swoją ustaloną częstością (np. 16 i 22 Hz) - warto zadbać aby nie były to częstości powiązane ze sobą harmonicznie, a z drugiej strony aby, biorąc pod uwagę wyniki poprzedniego zadania, dawały dobra odpowiedź SSVEP.&lt;br /&gt;
&lt;br /&gt;
Eksperyment będzie miał dwie cześci: sesję kalibracje i sesję on-line. Pomiędzy tymi sesjami będziemy uczyć kalsyfikator. Na podstawie części kalibracyjnej ustalimy jakie parametry przetwarznego on-line sygnału świadczą o patrzeniu się na diodę z lewej a jakie na tą z prawej strony ekranu.&lt;br /&gt;
&lt;br /&gt;
Potem w sesji online będziemy porównywać (za pomocą predykcji klasyfikatora) rejestrowany sygnał z tymi warościami kalibracyjnymi i na tej podstawie system będzie zwracał informację o wyborze lewej lub prawej diody. To powinno umożliwić prostą komunikację na zasadzie pytanie i odpowiedź TAK/NIE.&lt;br /&gt;
&lt;br /&gt;
==== Sesja kalibracycjna====&lt;br /&gt;
* Zakładamy czepek&lt;br /&gt;
* Częstość próbkowania ustawiamy na 256Hz&lt;br /&gt;
* Na podstawie kodu: https://brain.fuw.edu.pl/edu/index.php/Laboratorium_EEG/Wprowadzenie_do_syg_online#.C4.86wiczenie:_Wykorzystanie_pomiaru_EMG_do_sterowania_on-line&lt;br /&gt;
tworzymy programik, który zamiast pętli while tworzy odpowiednie pętle for aby:&lt;br /&gt;
* pięciokrotnie zarejestrować sekwencję trzech warunków eksperymentalnych:&lt;br /&gt;
** patrz 5s na diodę z lewej (warunek l)&lt;br /&gt;
** patrz 5s na środek ekranu (warunek s)&lt;br /&gt;
** patrz 5s na diodę z prawej (warunek p)&lt;br /&gt;
* w czasie tego patrzenia:&lt;br /&gt;
** odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** zbieramy sześć zbiorów wyników -  zestawy RMSów związane z każdym z waunków kalibracyjnych (LEWY/SPOCZYNEK/PRAWY) dla PASMO_LEWE i PASMO_PRAWE.&lt;br /&gt;
* Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki. Zapamiętujemy współczynniki normalizacyjne.&lt;br /&gt;
** Ogladamy rozkłady uzyskanych wielkości (znormalizowanych RMSów). &lt;br /&gt;
** Uczymy klasyfikator np. regresję logistyczną (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) do rozpoznawania, z którym warunkiem patrzenia mamy do czynienia.&lt;br /&gt;
&lt;br /&gt;
==== Sesja online====&lt;br /&gt;
* wczytujemy wyuczony model i kalibracyjne wartości np.mean(RMS_s)) i np.sdt(RMS_s) dla pasm lewego i prawego&lt;br /&gt;
* Odbieramy próbki w pakietach o długości 0.5s &lt;br /&gt;
** każdy pakiet filtrujem (technika filtrowania on-line) w pasmach dookoła wybranych dwóch częstości (PASMO_LEWE / PASMO_PRAWE)&lt;br /&gt;
** przefiltrowany pakiet przeliczamy na RMS&lt;br /&gt;
** Normalizujemy RMSy. Dla pasma lewego obliczamy (RMS_(l/p/s) - np.mean(RMS_s)) / np.sdt(RMS_s) i analogicznie dla pasma prawego. Małe indeksy oznaczaają tu warunki.&lt;br /&gt;
** robimy predykcję klasyfikatora, z którym warunkiem patrzenia mamy do czynienia. Wyświetlamy na ekranie komunikat.&lt;br /&gt;
* Testujemy czy powyższy schemat analizy pozwala na komunikację.&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Eksperyment ASSR===&lt;br /&gt;
W eksprymencie wykorzystujemy układ do generacji potencjałów słuchowych stanu ustalonego (ASSR). Wejście układu ASSR typu mini-jack wkładamy w wyjście słuchawkowe w laptopie. Drugie wejście układu ASSR wkładamy do wyjścia triggera we wzmacniaczu. Uruchamiamy plik dźwiękowy MM40tr.wav. Można go znalezc w: http://www.fuw.edu.pl/~suffa/LabEEG/MM40tr.wav&lt;br /&gt;
&lt;br /&gt;
Stymulacja dźwiękowa składa sie z fali nośnej o częstości 400 Hz modulowanej z częstością 40 Hz. Plik dźwiękowy zawiera 5 sekund ciszy i 5 sekund stymulacji, powtórzone 40 razy.&lt;br /&gt;
&lt;br /&gt;
====Rejestracja sygnału====&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-10, 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;
# Oklejamy kwadrat 3&amp;amp;times;3 elektrod na korze słuchowej z lewej strony (elektrody FT7, FC5, FC3, T7, C5, T3, TP7, CP5, CP3), 3&amp;amp;times;3 elektrod na korze słuchowej z prawej strony (elektrody FT8, FC6, FC4, T8, C6, T4, TP8, CP6, CP4), elektrody Fz, Cz, Pz i Oz, elektrody referencyjne A1 i A2. W sumie powinno być 24 elektrody.&lt;br /&gt;
# Elektrodę GND mocujemy na pozycji AFz.&lt;br /&gt;
# Sygnał rejestrujemy z częstością 2048 Hz.&lt;br /&gt;
# Do rejestracji stosujemy scenariusz 'ASSR' w interfejsie obci_gui.&lt;br /&gt;
&lt;br /&gt;
====Analiza====&lt;br /&gt;
 JZ: zmieniłbym analizę na czas-częstość i zrobił porównanie montażu usznego do filtra G.G. Moliny&lt;br /&gt;
&lt;br /&gt;
Początek stymulacji dźwiękowej oznaczymy jako 0. Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
Wyznaczenie pasma częstości odpowiedzi ASSR&lt;br /&gt;
# Z sygnału wycinamy fragmenty od 0 do 5 sek. dla wszystkich elektrod położone nad korą słuchową.&lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane zespolone widma uśredniamy po realizacjach.&lt;br /&gt;
# Sprawdzamy czy w uśrednionym widmie występuję maksimum w częstości modulacji tj. 40 Hz.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie przebiegu czasowego ERD i ERS====&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Czebyszewa 2 rodzaju) zgodne z wyznaczonym pasmem. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +10 sekund (wszystkie kanały). Przefiltruj każdą realizację.&lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat modułu transformaty Hilberta).&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 s. 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. Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
Przelicz potencjały z elektrod, w których występuję odpowiedź ASSR na montaż Hjortha i powtórz analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Plik:Inverse_problem_vs_bss.png&amp;diff=11767</id>
		<title>Plik:Inverse problem vs bss.png</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Plik:Inverse_problem_vs_bss.png&amp;diff=11767"/>
		<updated>2026-04-27T13:10:42Z</updated>

		<summary type="html">&lt;p&gt;Jarekz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Porównanie metod ślepej separacji źródeł i rozwiązań problemu odwrotnego w EEG&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>