Pracownia EEG 2/EEG wlasności EEG spoczynkowego: Różnice pomiędzy wersjami

Z Brain-wiki
(Utworzono nową stronę "<li> Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi ocza...")
 
 
(Nie pokazano 26 wersji utworzonych przez 2 użytkowników)
Linia 1: Linia 1:
<li> Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Sygnał ten będzie potrzebny w czasie kolejnych zajęć, więc zapisz jego kopię zapasową.
+
[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo
 +
 
 +
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=
 +
==Wstęp==
 +
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].
 +
 
 +
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.
 +
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu.
 +
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu <math>x(t)</math> i <math>x(t+\tau )</math> otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami <math>x(t + T)</math> i <math>x(t + T+\tau )</math>, gdzie <math>T</math> to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami <math>\tau</math>, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu <math>t</math> w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału <math>x</math> w chwilach czasu <math>t</math> czyli <math>x(t)</math> i wartości sygnału <math>x</math> w chwili czasu ''t''+&tau; czyli <math>x(t+\tau)</math> i uśredniając wartości iloczynów po czasie <math>T</math>:
 +
 
 +
<equation id="uid79">
 +
<math>
 +
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]
 +
</math> &nbsp;&nbsp;&nbsp;&nbsp;(1)
 +
</equation>
 +
 
 +
gdzie:
 +
 
 +
<equation id="uid80">
 +
<math>
 +
\mu = \mathrm{E}[x(t)]
 +
</math> &nbsp;&nbsp;&nbsp;&nbsp;(2)
 +
</equation>
 +
 
 +
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:
 +
 
 +
<equation id="uid81">
 +
<math>
 +
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt
 +
</math> &nbsp;&nbsp;&nbsp;&nbsp;(3)
 +
</equation>
 +
 
 +
natomiast dla sygnałów dyskretnych jako:
 +
 
 +
<equation id="uid82">
 +
<math>
 +
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)
 +
</math> &nbsp;&nbsp;&nbsp;&nbsp;(4)
 +
</equation>
 +
 
 +
gdzie:
 +
 
 +
<equation id="uid83">
 +
<math>
 +
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}
 +
</math> &nbsp;&nbsp;&nbsp;&nbsp;(5)
 +
</equation>
 +
 
 +
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:
 +
 
 +
<equation id="uid84">
 +
<math>
 +
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}
 +
</math> &nbsp;&nbsp;&nbsp;&nbsp;(6)
 +
</equation>
 +
 
 +
gdzie:
 +
 
 +
<equation id="uid85">
 +
<math>
 +
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]
 +
</math> &nbsp;&nbsp;&nbsp;&nbsp;(7)
 +
</equation>
 +
 
 +
Wariancję sygnału (<math>\gamma (0)=\sigma ^2</math>) można wyrazić przez funkcję autokowariancji dla przesunięcia <math>\tau =0</math>.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&minus;1,&nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:
 +
 
 +
<equation id="uid86">
 +
<math>
 +
\rho(k) = \frac{\gamma (k)}{\gamma (0)}
 +
</math> &nbsp;&nbsp;&nbsp;&nbsp;(8)
 +
</equation>
 +
 
 +
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia <math>\tau =0</math>.
 +
 
 +
 
 +
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.
 +
 
 +
==Polecenie:==
 +
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną <tt>scipy.signal.correlate</tt>. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).
 +
 
 +
Uwaga: funkcja <tt>numpy.correlate</tt> zasadniczo robi to samo, ale wyraźnie dłużej, szczególnie dla dłuższych sygnałów.
 +
 
 +
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem <xr id="uid82">(%i)</xr>. Funkcja powinna przyjmować jako parametry dwa wektory<!--i maksymalne przesunięcie wzajemne tych wektorów-->, a zwracać wektor zawierający ich funkcję autokorelacji.
 +
 
 +
Wywołanie przykładowe:
 +
<source lang = python>
 +
a = np.array([1,2,3])
 +
print(koreluj(a,a))
 +
</source>
 +
powinno dać wynik:
 +
[-0.5  0.  1.  0.  -0.5]
 +
 
 +
<!--
 +
<source lang = python>
 +
# Średnia
 +
mean = numpy.mean(data)
 +
mean2 = numpy.mean(data2)
 +
 
 +
# Wariancja
 +
var = numpy.var(data)  # uwaga: domyślnie ddof=0
 +
var2 = numpy.var(data2)
 +
 
 +
# Dane po odjęciu średnich
 +
ndata = data - mean
 +
ndata2 = data2 - mean2
 +
 
 +
# Splot
 +
acorr = numpy.correlate(ndata, ndata2, 'full')
 +
 
 +
# Normalizacja kowariancji do korelacji i przez 1/N
 +
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)  # len(ndata) bez -1, bo ddof=0 w var
 +
 
 +
print(acorr)
 +
</source>
 +
-->
 +
 
 +
 
 +
<!--{{hidden begin|title=Przykładowe rozwiązanie:}}-->
 +
<!-- <tt>*</tt> -->
 +
<!--
 +
<source lang = python>
 +
import numpy as np
 +
 
 +
def koreluj_pol(x,y,max_tau):
 +
    x = x - np.mean(x)
 +
    y = y - np.mean(y)
 +
    N= len(x)
 +
    cor = np.zeros(max_tau+1)
 +
    cor[0] = np.sum(x[:]*y[:])
 +
    for i in range(1,max_tau+1):
 +
        cor[i] = np.sum(x[i:]*y[:-i])
 +
       
 +
    cor = cor /(N-1)
 +
    return cor
 +
 
 +
def koreluj(x,y,max_tau):
 +
    cor = np.zeros(2*max_tau+1)   
 +
    cor[max_tau:] = koreluj_pol(x,y,max_tau)
 +
    tmp = koreluj_pol(y,x,max_tau)
 +
    cor[:max_tau+1] = tmp[-1::-1]
 +
    return cor   
 +
   
 +
a = np.array([1,2,3])
 +
for i in range(3):
 +
    print koreluj(a,a,i)
 +
   
 +
   
 +
a = np.array([1,2,3])
 +
b = np.array([-1,-2,-3])
 +
 
 +
for i in range(3):
 +
    print koreluj(a,b,i)
 +
   
 +
</source>
 +
{{hidden end}}
 +
-->
 +
 
 +
==Zadanie 1: Pomiar sygnału EEG ==
 +
 
 +
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz.
 +
 
 +
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==
 +
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:
 +
 
 +
# Wczytaj dane z wybranego kanału.
 +
# Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia <math>\tau </math>. Oś <math>\tau </math> wyskaluj w sekundach.
 +
# Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.
 +
# Porównaj autokorelogramy.
 +
 
 +
 
 +
==Funkcja kowariancji (wzajemnej)==
 +
 
 +
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:
 +
 
 +
<equation id="uid98">
 +
<math>
 +
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]</math>&nbsp;&nbsp;&nbsp;&nbsp;(10)
 +
</equation>
 +
 
 +
gdzie:
 +
 
 +
<equation id="uid99">
 +
<math>
 +
\begin{array}{l}
 +
\mu _x = \mathrm{E}[x(t)]\\
 +
\mu _y = \mathrm{E}[y(t)]\\ \end{array}
 +
</math>
 +
</equation>
 +
 
 +
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:
 +
 
 +
<equation id="uid100">
 +
<math>
 +
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt
 +
</math>
 +
</equation>
 +
 
 +
natomiast dla sygnałów dyskretnych jako:
 +
 
 +
<equation id="uid101">
 +
<math>
 +
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)
 +
</math>
 +
</equation>
 +
 
 +
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia <math>\tau =0</math>. Ponadto posiada ona następującą cechę:
 +
 
 +
<equation id="uid102">
 +
<math>
 +
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )
 +
</math>
 +
</equation>
 +
 
 +
Funkcję kowariancji można znormalizować:
 +
 
 +
<equation id="uid103">
 +
<math>
 +
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}
 +
</math>
 +
</equation>
 +
Otrzymaną funkcję nazywamy funkcją korelacji.
 +
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia <math>\tau </math> równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.
 +
 
 +
=====Polecenie =====
 +
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie <xr id="uid98">(%i)</xr>)<!-- skorzystaj przy tym z własności opisanej równaniem <xr id="uid98">(%i)</xr>-->.
 +
Przykładowe wywołanie:
 +
<source lang = python>
 +
a = np.array([1,2,3])
 +
b = np.array([-1,-2,-3])
 +
 
 +
print(koreluj(a,b))
 +
</source>
 +
powinno dać w wyniku:
 +
[ 0.5 0.  -1.  0.  0.5]
 +
 
 +
<!--
 +
{{hidden begin|title=Przykładowe rozwiązanie:}}
 +
<source lang = python>
 +
import numpy as np
 +
import pylab as py
 +
 
 +
def koreluj(x,y,max_tau):
 +
    x = x - np.mean(x)
 +
    y = y - np.mean(y)
 +
    cor = np.zeros(2*max_tau+1)
 +
    cor[max_tau] = np.sum(x[:]*y[:])
 +
    for i in range(1,max_tau+1):
 +
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])
 +
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])
 +
    N= len(x)
 +
    cor = cor /(N-1)
 +
    return cor
 +
 
 +
a = np.array([1,2,3])
 +
b = np.array([-1,-2,-3])
 +
for i in range(3):
 +
    print koreluj(a,b,i)
 +
</source>
 +
{{hidden end}} -->
 +
 
 +
===Zadanie 4===
 +
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.
 +
 
 +
<ol>
 +
 
 +
<li>
 +
Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. <xr id="uid9"> %i</xr>)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?
 +
 
 +
 
 +
<li>
 +
Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])
 +
 
 +
 
 +
<li>
 +
Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia <math>\tau</math>. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.
 +
 
 +
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:
 +
<ol type="A">
 +
<li> Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.
 +
<li> Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.
 +
<li> Powtórzenie kroków A i B wiele (np. 1000) razy.
 +
<li> Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia <math>\tau</math> korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych. 
 +
<li> Powtórzenie kroków A-D dla kolejnych przesunięć <math>\tau</math>.
 +
<li> Sprawdzenie, dla których przesunięć <math>\tau </math> funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.
 +
</ol>
 +
 
 +
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć <math>\tau </math>, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.
 +
Występuje tu zatem ''problem wielokrotnych porównań''.
 +
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &bdquo;istotnych&rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej.
 +
 
 +
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:
 +
 
 +
<ol type="A">
 +
<li> Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.
 +
<li> Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.
 +
<li>    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).
 +
<li> Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.
 +
<li>    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.
 +
<li> Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć <math>\tau </math> wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.
 +
</ol>
 +
 
 +
</ol>
 +
 
 +
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|<figure id="uid9" />Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]
 +
 
 +
=Związek autokorelacji z widmem sygnału=
 +
==Wstęp==
 +
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:
 +
 
 +
<equation id="uid93">
 +
<math>
 +
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau </math> &nbsp;&nbsp;&nbsp;&nbsp;(9)
 +
</equation>
 +
 
 +
gdzie:
 +
 
 +
<ul>
 +
 
 +
<li>
 +
<math>f</math> &mdash; częstość
 +
 
 +
 
 +
<li>
 +
<math>S(f)</math> &mdash;  gęstość widmowa mocy
 +
 
 +
</ul>
 +
 
 +
<!--
 +
Poniższy kod ilustruje to twierdzenie:
 +
<source lang = py>
 +
# -*- coding: utf-8 -*-
 +
from __future__ import division
 +
import pylab as py
 +
import numpy as np
 +
from numpy.fft import rfft,fft,fftfreq,fftshift
 +
 +
def widmo_mocy(s, Fs):
 +
    '''Funkcja licąca widmo mocy metodą periodogramu,
 +
pobiera sygnał i częstość próbkowania
 +
zwraca widmo mocy i oś częstości
 +
    '''
 +
    S = fft(s)/np.sqrt(len(s))
 +
    S_moc = S*S.conj()
 +
    S_moc = S_moc.real
 +
    F = fftfreq(len(s), 1/Fs)
 +
    return (fftshift(S_moc),fftshift(F))
 +
 +
def sin(f = 1, T = 1, Fs = 128, phi =0 ):
 +
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania
 +
    Domyślnie wytwarzany jest sygnał reprezentujący
 +
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz
 +
    '''
 +
    dt = 1.0/Fs
 +
    t = np.arange(0,T,dt)
 +
    s = np.sin(2*np.pi*f*t + phi)
 +
    return (s,t)
 +
 +
# sygnał próbny będzie próbkowany z częstością FS
 +
FS = 100.0
 +
# sygnałem próbnym będzie sinusoida o częstości f
 +
(s,t) = sin(f=10.5,Fs=FS)
 +
# obliczamy moc i energię sygnału w dziedzinie czasu
 +
moc_w_czasie = s**2
 +
energia_w_czasie = np.sum(moc_w_czasie)
 +
print 'energia w czasie: ', energia_w_czasie
 +
 +
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości
 +
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)
 +
energia_w_czestosci = np.sum(moc_w_czestosci)
 +
print 'energia w czestosci: ', energia_w_czestosci
 +
 +
# estymujemy funkcję autokorelacji sygnału
 +
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')
 +
 
 +
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:
 +
moc_chi = np.abs(fft(ak))
 +
energia_chin = sum(moc_chi)
 +
print 'energia z tw. Chinczyna przez fft: ', energia_chin
 +
 +
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:
 +
FF = np.linspace(-FS/2,FS/2,1000)
 +
M = np.zeros(len(FF),dtype='complex')
 +
 +
for i,f in enumerate( FF):
 +
    for tau in range(len(ak)):
 +
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS)
 +
M = np.abs(M)
 +
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))
 +
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum
 +
 
 +
# Rysunki
 +
py.figure(1)
 +
py.subplot(3,1,1)
 +
py.plot(t,s)
 +
py.title(u'Sygnal')
 +
py.subplot(3,1,2)
 +
py.plot(t,moc_w_czasie)
 +
py.title(u'moc w czasie')
 +
py.subplot(3,1,3)
 +
py.plot(F,moc_w_czestosci)
 +
py.title(u'moc w czestosci')
 +
 +
py.figure(2)
 +
py.subplot(3,1,1)
 +
py.title('f. autokowariancji')
 +
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)
 +
py.subplot(3,1,2)
 +
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))
 +
py.title('widmo mocy z Tw. Chinczyna przez fft')
 +
py.subplot(3,1,3)
 +
py.plot(FF,M)
 +
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')
 +
py.show()
 +
</source>
 +
 
 +
W wyniku powinniśmy zobaczyć w terminalu:
 +
energia w czasie:  50.0
 +
energia w czestosci:  50.0
 +
energia z tw. Chinczyna przez fft:  50.0
 +
energia z tw. Chinczyna przez sumowanie:  49.9501172217
 +
 
 +
oraz powinny pojawić się rysunki:
 +
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]
 +
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]
 +
-->
 +
 
 +
==Polecenie ==
 +
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości <tt>f</tt> i zadanej częstości próbkowania sygnału (tutaj: 10).
 +
<!--
 +
Wywołanie przykładowe:
 +
<source lang = python>
 +
t= np.arange(0,1,0.1)
 +
x = np.sin(2*np.pi*2*t)
 +
f = np.arange(-5,5,1)
 +
X,f = fourier(x,f,10.0)
 +
print X
 +
</source>
 +
 
 +
 
 +
 
 +
Natomiast wywołanie:
 +
<source lang ='python'>
 +
t= np.arange(0,1,0.1)
 +
x = np.sin(2*np.pi*2*t)
 +
f = np.arange(-5,5,0.01)
 +
X = fourier(x,f,10.0)
 +
py.plot(f,np.abs(X))
 +
py.show()
 +
</source>
 +
 
 +
Powinno wytworzyć rysunek:
 +
 
 +
[[Plik:Fourier_test.png]]
 +
-->
 +
 
 +
 
 +
<!-- <tt>*</tt> -->
 +
<!--
 +
import numpy as np
 +
import pylab as py
 +
 
 +
 
 +
 
 +
def koreluj_pol(x,y,max_tau):
 +
    x = x - np.mean(x)
 +
    y = y - np.mean(y)
 +
    N= len(x)
 +
    cor = np.zeros(max_tau+1)
 +
    cor[0] = np.sum(x[:]*y[:])
 +
    for i in range(1,max_tau+1):
 +
        cor[i] = np.sum(x[i:]*y[:-i])
 +
       
 +
    cor = cor /(N)
 +
    return cor
 +
 
 +
def koreluj(x,y,max_tau):
 +
    cor = np.zeros(2*max_tau+1)   
 +
    cor[max_tau:] = koreluj_pol(x,y,max_tau)
 +
    tmp = koreluj_pol(y,x,max_tau)
 +
    cor[:max_tau+1] = tmp[-1::-1]
 +
    return cor 
 +
   
 +
 
 +
def fourier_chin(x, FF, FS):
 +
    ak = koreluj(x,x,len(x)-1)
 +
    M = np.zeros(len(FF),dtype='complex')
 +
    for i,f in enumerate( FF):
 +
        for tau in range(len(ak)):
 +
    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)
 +
    #M/=np.sqrt(len(ak))
 +
    return M
 +
   
 +
def fourier(ak, FF, FS):
 +
 
 +
    M = np.zeros(len(FF),dtype='complex')
 +
    for i,f in enumerate( FF):
 +
        for tau in range(len(ak)):
 +
    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)
 +
    M/=np.sqrt(len(ak))
 +
    return M
 +
t= np.arange(0,1,0.05)
 +
x = np.sin(2*np.pi*2*t)
 +
f = np.arange(-5,5,0.01)
 +
 
 +
X = fourier_chin(x,f,10.0)
 +
Xf = fourier(x,f,10.0)
 +
print X
 +
py.plot(f,np.abs(X), f,np.abs(Xf)**2)
 +
py.show()
 +
 
 +
-->
 +
 
 +
==Zadanie 3: Związek autokorelacji z widmem sygnału==
 +
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].
 +
Znajdź częstość rytmu &alpha; dla osoby, która była badana.
 +
 
 +
 
 +
==Wzajemna gęstość widmowa sygnałów==
 +
 
 +
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:
 +
 
 +
<equation id="uid122">
 +
<math>
 +
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau </math>
 +
</equation>
 +
 
 +
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:
 +
 
 +
<equation id="uid123">
 +
<math>
 +
\begin{array}{l}
 +
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\
 +
\\
 +
\phi _{xy} = \arg(S_{xy})
 +
\end{array} </math>
 +
</equation>
 +
<!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]-->
 +
 
 +
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały <math>x(t)</math> i <math>y(t)</math> są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &mdash; <math>\phi _{xy}(f)</math>. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:
 +
 
 +
<equation id="uid124">
 +
<math>
 +
\tau = \frac{\phi _{xy}(f)}{2\pi f}
 +
</math>
 +
</equation>
 +
 
 +
<!--
 +
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:
 +
 
 +
<equation id="uid125">
 +
<math>
 +
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}
 +
</math>
 +
</equation>
 +
 
 +
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''.
 +
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).
 +
-->
 +
 
 +
===Zadanie 5===
 +
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów.
 +
<!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. -->
 +
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.
 +
 
 +
===Zadanie 6===
 +
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.
 +
 
 +
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.

Aktualna wersja na dzień 13:39, 27 lis 2024

Pracownia EEG 2 / Własności EEG spoczynkowego: funkcja autokorelacji i widmo

Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.

Wstęp

Z funkcjami tymi spotkaliśmy się już na zajęciach z analizy sygnałów.

Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili. W przypadku stacjonarnych procesów stochastycznych, przebieg tej funkcji nie zależy od czasu. Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu [math]x(t)[/math] i [math]x(t+\tau )[/math] otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami [math]x(t + T)[/math] i [math]x(t + T+\tau )[/math], gdzie [math]T[/math] to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami [math]\tau[/math], dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu [math]t[/math] w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału [math]x[/math] w chwilach czasu [math]t[/math] czyli [math]x(t)[/math] i wartości sygnału [math]x[/math] w chwili czasu t+τ czyli [math]x(t+\tau)[/math] i uśredniając wartości iloczynów po czasie [math]T[/math]:

[math] \gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )] [/math]     (1)

gdzie:

[math] \mu = \mathrm{E}[x(t)] [/math]     (2)

W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:

[math] \gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt [/math]     (3)

natomiast dla sygnałów dyskretnych jako:

[math] \gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s) [/math]     (4)

gdzie:

[math] x_s = \frac{\sum _{i=1}^{N}x(i)}{N} [/math]     (5)

Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji — funkcję autokorelacji. Normalizacja ta wygląda następująco:

[math] \rho (k) = \frac{\gamma (\tau )}{\sigma^2} [/math]     (6)

gdzie:

[math] \sigma ^2 = \mathrm{E}[(x(t)-\mu )^2] [/math]     (7)

Wariancję sygnału ([math]\gamma (0)=\sigma ^2[/math]) można wyrazić przez funkcję autokowariancji dla przesunięcia [math]\tau =0[/math]. Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [−1, 1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:

[math] \rho(k) = \frac{\gamma (k)}{\gamma (0)} [/math]     (8)

Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia [math]\tau =0[/math].


Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.

Polecenie:

Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną scipy.signal.correlate. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).

Uwaga: funkcja numpy.correlate zasadniczo robi to samo, ale wyraźnie dłużej, szczególnie dla dłuższych sygnałów.

Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem (4). Funkcja powinna przyjmować jako parametry dwa wektory, a zwracać wektor zawierający ich funkcję autokorelacji.

Wywołanie przykładowe:

a = np.array([1,2,3])
print(koreluj(a,a))

powinno dać wynik:

[-0.5  0.   1.   0.  -0.5]



Zadanie 1: Pomiar sygnału EEG

Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz.

Zadanie 2: Funkcje autokowariancji i autokorelacji

W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:

  1. Wczytaj dane z wybranego kanału.
  2. Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia [math]\tau [/math]. Oś [math]\tau [/math] wyskaluj w sekundach.
  3. Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.
  4. Porównaj autokorelogramy.


Funkcja kowariancji (wzajemnej)

W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:

[math] \gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)][/math]    (10)

gdzie:

[math] \begin{array}{l} \mu _x = \mathrm{E}[x(t)]\\ \mu _y = \mathrm{E}[y(t)]\\ \end{array} [/math]

W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:

[math] \gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt [/math]

natomiast dla sygnałów dyskretnych jako:

[math] \gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s) [/math]

W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia [math]\tau =0[/math]. Ponadto posiada ona następującą cechę:

[math] \gamma _{xy}(-\tau ) = \gamma _{yx}(\tau ) [/math]

Funkcję kowariancji można znormalizować:

[math] \rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y} [/math]

Otrzymaną funkcję nazywamy funkcją korelacji. Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia [math]\tau [/math] równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą — w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.

Polecenie

Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów x i y (równanie (9)). Przykładowe wywołanie:

a = np.array([1,2,3])
b = np.array([-1,-2,-3])

print(koreluj(a,b))

powinno dać w wyniku:

[ 0.5 0.  -1.   0.   0.5]


Zadanie 4

Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.

  1. Dla każdego kanału oblicz funkcję autokorelacji, zaś dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. %i 1)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną — funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?
  2. Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. (przypomnienie konstrukcji filtrów)
  3. Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody bootstrap. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia [math]\tau[/math]. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy. Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:
    1. Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.
    2. Obliczenie funkcji korelacji wzajemnej dla sygnałów policzonych w punkcie A.
    3. Powtórzenie kroków A i B wiele (np. 1000) razy.
    4. Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia [math]\tau[/math] korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.
    5. Powtórzenie kroków A-D dla kolejnych przesunięć [math]\tau[/math].
    6. Sprawdzenie, dla których przesunięć [math]\tau [/math] funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.

    Procedura opisana powyżej ma jednak zasadniczą wadę. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć [math]\tau [/math], co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji. Występuje tu zatem problem wielokrotnych porównań. Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako „istotnych” statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom p będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej.

    W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. korektę Bonferroniego czy false discovery rate (FDR). Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:

    1. Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.
    2. Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.
    3. Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).
    4. Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.
    5. Wyznaczenie 95 centyla rozkładu wartości maksymalnych.
    6. Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć [math]\tau [/math] wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.
Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.

Związek autokorelacji z widmem sygnału

Wstęp

Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z Analizy Sygnałów, widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:

[math] S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau [/math]     (9)

gdzie:

  • [math]f[/math] — częstość
  • [math]S(f)[/math] — gęstość widmowa mocy


Polecenie

Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości f i zadanej częstości próbkowania sygnału (tutaj: 10).


Zadanie 3: Związek autokorelacji z widmem sygnału

Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz metodą Welcha. Znajdź częstość rytmu α dla osoby, która była badana.


Wzajemna gęstość widmowa sygnałów

Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:

[math] S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau [/math]

W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:

[math] \begin{array}{l} S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\ \\ \phi _{xy} = \arg(S_{xy}) \end{array} [/math]

Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla częstości, w których sygnały [math]x(t)[/math] i [math]y(t)[/math] są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji — [math]\phi _{xy}(f)[/math]. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:

[math] \tau = \frac{\phi _{xy}(f)}{2\pi f} [/math]


Zadanie 5

Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.

Zadanie 6

Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.

Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.