1 Estymacja i analiza względnych zmian gęstości energii sygnału EEG w przestrzeni czasczęstość

Podobne dokumenty
Definicja. x(u)h (u t)e i2πuf du. F x (t,f ;h) = Krótko czasowa transformata Fouriera Ciągłą transformata falkowa

Spis treści. Widmo mocy. Obliczanie mocy sygnału. Analiza_sygnałów_-_ćwiczenia/Fourier_4

Laboratorium Przetwarzania Sygnałów Biomedycznych

Twierdzenie o splocie

LABORATORIUM AKUSTYKI MUZYCZNEJ. Ćw. nr 12. Analiza falkowa dźwięków instrumentów muzycznych. 1. PODSTAWY TEORETYCZNE ANALIZY FALKOWEJ.

Cyfrowe przetwarzanie i kompresja danych

Przetwarzanie Sygnałów. Zastosowanie Transformaty Falkowej w nadzorowaniu

Akwizycja i przetwarzanie sygnałów cyfrowych

Ćwiczenia z przetwarzania tablic 2D

2. Próbkowanie Sygnały okresowe (16). Trygonometryczny szereg Fouriera (17). Częstotliwość Nyquista (20).

Akustyka muzyczna ANALIZA DŹWIĘKÓW MUZYCZNYCH

Przedmowa Wykaz oznaczeń Wykaz skrótów 1. Sygnały i ich parametry Pojęcia podstawowe Klasyfikacja sygnałów

DYSKRETNA TRANSFORMACJA FOURIERA

9. Dyskretna transformata Fouriera algorytm FFT

1 s(t) 2 t s(t) 2 dt 1. s(t) 2

Analizy Ilościowe EEG QEEG

Laboratorium Cel ćwiczenia Celem ćwiczenia jest zapoznanie się z przetwarzaniem sygnałów w MATLAB. 2. Program ćwiczenia. Przykład 1 Wprowadź

Klasyczna rekonstrukcja obrazu (Beamforming)

Przekształcenie Fouriera i splot

Laboratorium Przetwarzania Sygnałów Biomedycznych

8. Analiza widmowa metodą szybkiej transformaty Fouriera (FFT)

Laboratorium Przetwarzania Sygnałów

Transformacje Fouriera * podstawowe własności

Zadania z rysowania i dopasowania funkcji

Układy i Systemy Elektromedyczne

Transformata Fouriera

Zadanie: Filtr adaptywny

Zmiany fazy/okresu oscylacji Chandlera i rocznej we współrzędnych bieguna ziemskiego.

KARTA MODUŁU / KARTA PRZEDMIOTU

Algorytmy, które estymują wprost rozkłady czy też mapowania z nazywamy algorytmami dyskryminacyjnymi.

Przekształcenia widmowe Transformata Fouriera. Adam Wojciechowski

Przekształcenie Fouriera obrazów FFT

uzyskany w wyniku próbkowania okresowego przebiegu czasowego x(t) ze stałym czasem próbkowania t takim, że T = t N 1 t

Przetwarzanie sygnałów biomedycznych

Zakładamy, że są niezależnymi zmiennymi podlegającymi (dowolnemu) rozkładowi o skończonej wartości oczekiwanej i wariancji.

4 Zasoby językowe Korpusy obcojęzyczne Korpusy języka polskiego Słowniki Sposoby gromadzenia danych...

Algorytmy detekcji częstotliwości podstawowej

Analiza szeregów czasowych: 2. Splot. Widmo mocy.

Cyfrowe Przetwarzanie Obrazów i Sygnałów

Metody analizy zapisu EEG. Piotr Walerjan

Laboratorium Przetwarzania Sygnałów Biomedycznych

Politechnika Wrocławska Wydział Elektroniki Mikrosystemów i Fotoniki Przetwarzanie sygnałów laboratorium ETD5067L

Przetwarzanie sygnałów

Teoria Sygnałów. Inżynieria Obliczeniowa II rok 2018/19. Wykład 10. ( t) Wykorzystanie transformacji Fouriera w analizie korelacyjnej

7. Szybka transformata Fouriera fft

Spis treści. Metody nieparametryczne. Transformacja Fouriera

Cyfrowe Przetwarzanie Obrazów i Sygnałów

POLITECHNIKA OPOLSKA

FFT i dyskretny splot. Aplikacje w DSP

Analiza szeregów czasowych: 2. Splot. Widmo mocy.

Przetwarzanie sygnałów biomedycznych

Podstawy Automatyki. Wykład 5 - stabilność liniowych układów dynamicznych. dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

SIMR 2016/2017, Analiza 2, wykład 1, Przestrzeń wektorowa

DYSKRETNE PRZEKSZTAŁCENIE FOURIERA C.D.

Weryfikacja hipotez statystycznych

CHARAKTERYSTYKI CZĘSTOTLIWOŚCIOWE

Laboratorium Przetwarzania Sygnałów Biomedycznych

Model autoregresyjny stochastycznego szeregu czasowego

Transformata Fouriera i analiza spektralna

Wprowadzenie. Spis treści. Analiza_sygnałów_-_ćwiczenia/Filtry

Automatyczne rozpoznawanie mowy - wybrane zagadnienia / Ryszard Makowski. Wrocław, Spis treści

Ćwiczenie 3. Właściwości przekształcenia Fouriera

Sposoby opisu i modelowania zakłóceń kanałowych

Podstawy Automatyki. Wykład 5 - stabilność liniowych układów dynamicznych. dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Analiza porównawcza wybranych transformat w kontekście zobrazowania zaszumionego sygnału harmonicznego

Po zapoznaniu się z funkcją liniową możemy przyjśd do badania funkcji kwadratowej.

ANALIZA SEMANTYCZNA OBRAZU I DŹWIĘKU

Rozkłady dwóch zmiennych losowych

Celem tych ćwiczeń jest zapoznanie się z klasyfikacją za pomocą sieci neuronowych.

Szukanie rozwiązań funkcji uwikłanych (równań nieliniowych)

Cyfrowe przetwarzanie sygnałów. Wykład 10. Transformata cosinusowa. Falki. Transformata falkowa. dr inż. Robert Kazała

Zmiany fazy/okresu oscylacji Chandlera i rocznej we współrzędnych bieguna ziemskiego.

Ćwiczenie 12/13. Komputerowy hologram Fouriera. Wprowadzenie teoretyczne

Transformacje i funkcje statystyczne

Generowanie sygnałów na DSP

Wykład VI Dalekie pole

METODY ROZWIĄZYWANIA RÓWNAŃ NIELINIOWYCH

Podstawy Przetwarzania Sygnałów

Zastosowanie falek w przetwarzaniu obrazów

Szereg i transformata Fouriera

Wykład 2. Transformata Fouriera

KADD Metoda najmniejszych kwadratów funkcje nieliniowe

Diagnostyka obrazowa

Laboratorium Przetwarzania Sygnałów. Ćwiczenie 2. Analiza widmowa

Akwizycja i przetwarzanie sygnałów cyfrowych

Temat ćwiczenia. Analiza częstotliwościowa

ROZKŁAD MATERIAŁU DO II KLASY LICEUM (ZAKRES ROZSZERZONY) A WYMAGANIA PODSTAWY PROGRAMOWEJ.

Zad. 3: Układ równań liniowych

Podstawy Automatyki. Wykład 5 - stabilność liniowych układów dynamicznych. dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

LABORATORIUM PODSTAW TELEKOMUNIKACJI

Ćwiczenie M-2 Pomiar przyśpieszenia ziemskiego za pomocą wahadła rewersyjnego Cel ćwiczenia: II. Przyrządy: III. Literatura: IV. Wstęp. l Rys.

V. WYMAGANIA EGZAMINACYJNE

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

Komputerowa Analiza Danych Doświadczalnych

Systemy i Sieci Telekomunikacyjne laboratorium. Modulacja amplitudy

Teoria sygnałów Signal Theory. Elektrotechnika I stopień (I stopień / II stopień) ogólnoakademicki (ogólno akademicki / praktyczny)

Akademia Górniczo-Hutnicza Wydział Elektrotechniki, Automatyki, Informatyki i Elektroniki

Ćwiczenie 11. Wprowadzenie teoretyczne

W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. for (w1;w2;w3) instrukcja

ĆWICZENIE III ANALIZA WIDMOWA SYGNAŁÓW DYSKRETNYCH. ver.3

Transkrypt:

Pracownia EEG / Czas-częstość Spis treści 1 Estymacja i analiza względnych zmian gęstości energii sygnału EEG w przestrzeni czasczęstość 1.1 Zasada nieoznaczoności dla przestrzeni czas-częstość 1.2 Estymatory gęstości widmowej dla przestrzeni czas-częstość 1.2.1 Dystrybucja energii 1.2.1.1 Implementacja 1.2.1.2 Własności 1.2.1.3 Wyrazy mieszane 1.2.1.4 Rozdzielczość 1.2.2 Klasa Cohena 1.2.3 MP dopasowanie kroczące 1.2.3.1 Definicja 1.2.3.2 Dystrybucja energii 1.3 Krótkoczasowa transformacja Fouriera i spektrogram 1.3.1 Definicja krótkoczasowej transformacji Fouriera 1.3.1.1 Własności 1.3.2 Spektrogram 1.3.2.1 Definicja 1.3.2.2 Implementacja 1.3.2.3 Własności 1.3.2.3.1 Przesunięcia 1.3.2.3.2 Wyrazy mieszane 1.3.2.4 Ćwiczenie: 1.4 Ciągła transformata falkowa i skalogram 1.4.1 Ciągłą transformata falkowa 1.4.1.1 Definicja 1.4.2 Skalogram 1.4.2.1 Implementacja 1.4.3 Matching pursuit 1.4.4 Ćwiczenia 1.4.4.1 Zadanie 1 1.4.4.2 Zadanie 2 1.4.4.3 Zadanie 4 1.4.4.4 Zadanie 5 1.5 Literatura

Estymacja i analiza względnych zmian gęstości energii sygnału EEG w przestrzeni czas-częstość Moduł tf używany w przykładach można pobrać w wersji Pythona stąd: import numpy as np import pylab as py import scipy.signal as ss def czas(t = 1.0, Fs = 128.0): dt = 1.0/Fs t = np.arange(,t,dt) return t def gauss(t0 = 0.3, sigma = 0.02, T = 1.0, Fs = 128.0): t = czas(t,fs) s = np.exp(-((t-t0)/(sigma))**2/2) return s def g2(t0 = 0.3, sigma = 0.02, T = 1.0, Fs = 128.0): t = czas(t,fs) s = (-(t-t0)/(sigma))*np.exp(-((t-t0)/(sigma))**2/2) return s def g3(t0 = 0.3, sigma = 0.02, T = 1.0, Fs = 128.0): t = czas(t,fs) s = np.exp(-((t-t0)/(sigma))**2/2) s[t<t0] = return s def gabor(t0 = 0.5, sigma = 0.1, T = 1.0, f=10, phi =, Fs = 128.0): t = czas(t,fs) s = np.exp(-((t-t0)/(sigma))**2/2) * np.cos(2*np.pi*f*(t-t0) + phi) return s def sin(f = 10.0, T = 1.0, Fs = 128.0, phi = ): '''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 ''' t = czas(t,fs) s = np.sin(2*np.pi*f*t + phi)

return s def chirp(f0,fk,t,fs): t = czas(t,fs) f = f0 + (fk-f0)/2.0/(t)*t s = np.cos(2*np.pi*t*f) return s def cwt(x, MinF,MaxF,Fs,w=7.0,df=1.0,plot = True): '''w - parametr falki Morleta, wiaze sie z jej czestoscia centralna i skala w nastepujacy sposob: f = 2*s*w / T gdzie: s-skala, T-dlugosc sygnalu w sek.''' T= len(x)/fs M = len(x) t = np.arange(,t,1./fs) freqs = np.arange(minf,maxf,df) P = np.zeros((len(freqs),m)) X = ss.fft(x) for i,f in enumerate(freqs): s = T*f/(2*w) psi = ss.fft(ss.morlet(m, w=w, s=s, complete=true)) psi /= np.sqrt(np.sum(psi*psi.conj())) tmp = np.fft.fftshift(ss.ifft(x*psi)) P[i,:] = (tmp*tmp.conj()).real if plot: py.imshow(p,aspect='auto',origin='lower',extent=(,t,minf, MaxF)) py.show() return P,f,t def wvd(x, Fs, plot=true): samples = len(x) N = samples / 2 z = np.zeros(samples) xh = ss.hilbert(x) x_period_h = np.concatenate((z,xh,z)); t = range(, samples, 1) # czas w samplach tfr = np.zeros((samples, samples), dtype=complex) for ti in t: for tau in range(-samples/2,samples/2): tfr[samples/2 + tau, ti] = x_period_h[samples+ti + tau] * x_period_h[samples+ti - tau].conj() tfr = np.fft.fftshift(tfr,axes = ) Tfr = np.fft.fft(tfr, samples, axis=)/samples

ts = np.array(t, dtype=float) / (float(fs)) f = np.linspace(, Fs / 2, N) if plot: py.imshow( Tfr.real, interpolation='nearest', extent=[, ts[-1],, f[-1]], origin='lower', aspect='auto') py.show() return Tfr, ts, f if name == ' main ': t = czas() Fs = 512.0 T = 1.0 #py.plot(t,sin(),t,gauss(),t,g2(),t,g3(),t,gabor()) ch = chirp(5,fs/2-5,t,fs) py.plot(ch) py.show() #cwt(gabor(),0.1,64,128) #cwt(ch,0.1,fs/2,fs) #ch = gabor(t0=0,f=fs/2) wvd(ch,fs) Zasada nieoznaczoności dla przestrzeni czas-częstość Poniższy rysunek obrazuje koncepcję zasady nieoznaczoności w przypadku analizy czas-częstość: im dokładniej znamy lokalizację interesującego nas fragmentu sygnału (struktury) w czasie tym mniej dokładnie możemy poznać jego częstość.

Zasadę tą można wyrazić formalnie w następujący sposób. Potraktujmy moc sygnału (o skończonej energii) jak rozkład zmiennej losowej. Aby rozkład był unormowany trzeba podzielić go przez energię sygnału:. Zatem rozkład ten jest postaci:. Jako lokalizację występowania sygnału w czasie przyjmujemy średnie położenie jego energii: zaś jako miarę skupienia energii wokół tego położenia przyjmujemy wariancję: Analogicznie w dziedzinie częstości: Można pokazać (np. Pinsky, 2002), że iloczyn wariancji energii w czasie i w częstości jest ograniczony od dołu:

Estymatory gęstości widmowej dla przestrzeni czas-częstość Energię sygnału w jednej z dziedzin, czasu bądź częstości, możemy policzyć tak: i interpretujemy albo jako gęstości energii. Stąd pomysł, żeby rozszerzyć tą koncepcję na obie dziedziny jednocześnie i wprowadzić pojęcie gęstości energii w dziedzinie czas-częstość : muszą też być spełnione własności brzegowe: Dystrybucja energii Podobnie jak widmo mocy, gęstość energii fizycznego sygnału nie może być obliczona, może być jedynie estymowana. W celu estymacji gęstości energii można posłużyć się dwuwymiarowymi dystrybucjami energii. Jedną z podstawowych dystrybucji jest dystrybucja Wigner-Ville'a (WVD): lub Implementacja Przykładowa implementacja WVD dla sygnału rzeczywistego:

import numpy as np import pylab as py import scipy.signal as ss def wvd(x, Fs, plot=true): samples = len(x) N = samples / 2 z = np.zeros(samples) xh = ss.hilbert(x) x_period_h = np.concatenate((z,xh,z)); t = range(, samples, 1) # czas w samplach tfr = np.zeros((samples, samples), dtype=complex) for ti in t: for tau in range(-samples/2,samples/2): tfr[samples/2 + tau, ti] = x_period_h[samples+ti + tau] * x_period_h[samples+ti - tau].conj() tfr = np.fft.fftshift(tfr,axes = ) Tfr = np.fft.fft(tfr, samples, axis=)/samples ts = np.array(t, dtype=float) / (float(fs)) f = np.linspace(, Fs / 2, N) if plot: py.imshow( Tfr.real, interpolation='nearest', extent=[, ts[-1],, f[-1]], origin='lower', aspect='auto') py.show() return Tfr, ts, f Własności Własności WVD: zachowanie energii własności brzegowe zachowywanie przesunięcia w czasie i w częstości zachowywanie skalowania

Wyrazy mieszane WVD jest reprezentacją kwadratową więc: gdzie Rozdzielczość idealnie dla chirpów liniowych (sygnał o liniowo zmieniającej się częstości chwilowej): import tf as tf import pylab as py Fs = 512.0 T = 1.0 t = tf.czas(t,fs) ch = tf.chirp(5,fs/2-5,t,fs) Tfr,ts,f = tf.wvd(ch,fs,false) py.subplot(2,1,1) py.plot(t,ch) py.subplot(2,1,2) py.imshow(tfr.real,interpolation= 'nearest',extent=[,ts[-1],,f[-1]],origin='lower',aspect='auto') py.show() struktura wyrazów mieszanych: zaobserwuj, że niezależnie od tego jak bardzo odseparowane są struktury w przestrzeni czas-częstość pomiędzy nimi powstają wyrazy mieszane. Zauważ, że wyrazy mieszane mają wysoką częstość przestrzennej zmienności. import tf as tf import pylab as py Fs = 512.0 T = 1.0

t = tf.czas(t,fs) s1 = tf.gabor(t0=0.3, sigma = 0.05, T = 1.0, f=100, phi =,Fs=Fs) s2 = tf.gabor(t0=0.7, sigma = 0.05, T = 1.0, f=200, phi =,Fs=Fs) s = s1 + s2 Tfr,ts,f = tf.wvd(s,fs,false) py.subplot(2,1,1) py.plot(t,s) py.subplot(2,1,2) py.imshow(tfr.real,interpolation= 'nearest',extent=[,ts[-1],,f[-1]],origin='lower',aspect='auto') py.show() Klasa Cohena WVD jest najprostszym elementem klasy Cohena. Ogólnie klasę tę można zapisać jako: gdzie Najczęściej wybiera się jako pewną funkcję gładzącą w zależności od tego wyboru będziemy mieli w różnym stopniu osłabiane wyrazy mieszane. MP dopasowanie kroczące Definicja Algorytm dopasowania kroczącego (ang. matching pursuit, MP) jest algorytmem iteracyjnie rozkładającym sygnał na funkcje bazowe (tzw. atomy czas-częstość) pochodzące ze zbioru (zwanego słownikiem): gdzie: oznacza tego, który daje największy iloczyn skalarny z aktualnym residuum:. Słowniki mogą być dowolne, ale najczęściej składamy je z funkcji Diraca, sinus i Gabora:

normalizacja jest taka, że, to parametry funkcji w słowniku ( translacja w czasie, częstość, szerokość w czasie, faza). Dystrybucja energii Reprezentację czas-częstość uzyskujemy z dekompozycji MP sumując dystrybucje WVD pojedynczych atomów: W wyrażeniu tym nie ma wyrazów mieszanych :-) Krótkoczasowa transformacja Fouriera i spektrogram Definicja krótkoczasowej transformacji Fouriera Krótkoczasowa transformacja Fouriera (ang. short-time Fourier transform, STFT) może być rozumiana jako seria transformacji Fouriera wykonanych na sygnale podzielonym na okienka, przy czym położenie okienka w czasie jest w ramach takiej serii przesuwane monotonicznie. W wersji ciągłej możemy to zapisać tak: Własności Jeśli okienko ma skończoną energię to STFT jest transformacją odwracalną i można odzyskać z niej sygnał w reprezentacji czasowej: gdzie Tak więc sygnał może być rozłożony na liniową kombinację elementarnych falek- atomów postaci:

Każdy atom uzyskiwany jest przez translację pojedynczego okna w czasie i jego modulację częstością. Ciekawostka: zbiór wszystkich możliwych transformacji tego typu tworzy grupę Weyl-Heisenberga. Spektrogram Definicja Spektrogram: kwadrat modułu STFT jest estymatą gęstości energii w przestrzeni czas-częstość: Implementacja Spektrogram zaiplementowany jest w module matplotlib.pyplot jako funkcja specgram (dokumentacja). Własności Przesunięcia Spektrogram zachowuje przesunięcie: w czasie import matplotlib.pyplot as py from tf import czas, gabor import numpy as np import scipy.signal as ss # parametry t0 = 1.0 sigma = 0.1 T = 4.0 f = 10 phi = Fs = 128.0 NFFT = int(fs) sig1 = gabor(t0, sigma, T, f, phi, Fs) # sygnał sig2 = gabor(t0 + 2, sigma, T, f, phi, Fs) # sygnał przesunięty w czasie

py.subplot(221) h = ss.hamming(nfft) sig1_padded = (np.concatenate((np.zeros(nfft/2),sig1,np.zeros(nfft/2)))) P,f,t,im1 = py.specgram(sig1_padded,nfft = len(h),fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') py.imshow(p,aspect='auto',origin='lower',extent=(t[]-(nfft/2)/fs,t[-1]- (NFFT/2)/Fs,f[],f[-1]),interpolation='nearest') py.subplot(222) sig2_padded = (np.concatenate((np.zeros(nfft/2),sig2,np.zeros(nfft/2)))) P,f,t,im2 = py.specgram(sig2_padded,nfft = len(h),fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') py.imshow(p,aspect='auto',origin='lower',extent=(t[]-(nfft/2)/fs,t[-1]- (NFFT/2)/Fs,f[],f[-1]),interpolation='nearest') py.subplot(223) time = czas(t, Fs) py.plot(time,sig1) py.subplot(224) py.plot(time,sig2) py.show() i w częstości: import matplotlib.pyplot as py from tf import czas, gabor import numpy as np import scipy.signal as ss # parametry t0 = 1.0 sigma = 0.1 T = 4.0 f = 10 phi = Fs = 128.0 NFFT = int(fs) time = czas(t, Fs)

sig1 = gabor(t0, sigma, T, f, phi, Fs) # sygnał sig2 = gabor(t0, sigma, T, f+20, phi, Fs)# sygnał przesunięty w częstości py.subplot(221) h = ss.hamming(nfft) sig1_padded = (np.concatenate((np.zeros(nfft/2),sig1,np.zeros(nfft/2)))) P,f,t,im1 = py.specgram(sig1_padded,nfft = len(h),fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') py.imshow(p,aspect='auto',origin='lower',extent=(t[]-(nfft/2)/fs,t[-1]- (NFFT/2)/Fs,f[],f[-1]),interpolation='nearest') py.subplot(222) sig2_padded = (np.concatenate((np.zeros(nfft/2),sig2,np.zeros(nfft/2)))) P,f,t,im2 = py.specgram(sig2_padded,nfft = len(h),fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') py.imshow(p,aspect='auto',origin='lower',extent=(t[]-(nfft/2)/fs,t[-1]- (NFFT/2)/Fs,f[],f[-1]),interpolation='nearest') py.subplot(223) py.plot(time,sig1) py.subplot(224) py.plot(time,sig2) py.show() Wyrazy mieszane Spektrogram jest reprezentacją kwadratową. Spektrogram sumy sygnałów nie jest sumą spektrogramów sygnałów składowych, jest tam jeszcze coś: gdzie Jak mogą wyglądać wyrazy mieszane ilustruje poniższy kod. Kolejne subploty pokazują spektrogramy uzyskane dla sygnału będącego sumą dwóch funkcji Gabora o częstościach różniących się o 2 Hz i położeniach różniących się o kolejne wielokrotności 0,1 s.

import matplotlib.pyplot as py from tf import czas, gabor import numpy as np import scipy.signal as ss # parametry t0 = 1.0 sigma = 0.05 T = 2.0 f0 = 20 phi = Fs = 128.0 NFFT = int(fs) time = czas(t, Fs) h = ss.hamming(nfft) for i in range(9): py.subplot(3,3,i+1) sig1 = gabor(t0, sigma, T, f0, phi, Fs) # sygnal sig2 = gabor(t0+i*0.1, sigma, T, f0+2, phi, Fs)# sygnał przesunięty w częstości o 2 Hz i w czasie o i*0.1 s sig1_padded = (np.concatenate((np.zeros(nfft/2),sig1,np.zeros(nfft/2)))) sig2_padded = (np.concatenate((np.zeros(nfft/2),sig2,np.zeros(nfft/2)))) P,f,t,im1 = py.specgram(sig1_padded+sig2_padded,nfft = len(h),fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') py.imshow(p,aspect='auto',origin='lower',extent=(t[]-(nfft/2)/fs,t[-1]- (NFFT/2)/Fs,f[],f[-1]),interpolation='nearest') py.show() Wyrazy mieszane występują także w przypadku pojedynczej struktury dla sygnału rzeczywistego. Mieszające się obiekty to energia zlokalizowana w dodatniej i ujemnej części widma częstości. Efekt jest stosunkowo słaby i uwidacznia się dopiero na mapach czas-częstość logarytmu gęstości energii. Problem ten można obejść stosując transformację Hilberta, gdyż po tej transformacji cała energia skupiona jest w dodatniej części widma. Własność tę ilustruje poniższy program: from matplotlib.pyplot import specgram, plot, subplot, show, imshow from tf import czas, gabor from numpy import pi, log from scipy.signal import hamming, hilbert # parametry t0 = 0.5

sigma = 0.1 T = 1.0 f = 30 phi = Fs = 256.0 s = gabor(t0, sigma, T, f, phi, Fs) t = czas(t, Fs) subplot(411) plot(t,s) subplot(412) h = hamming(32) NFFT =len(h) P,f,t,im1 = specgram(s,nfft = len(h),fs = Fs,window = h, noverlap = 31,sides = 'twosided') imshow(p,aspect='auto',origin='lower',extent=(t[]-(nfft/2)/fs,t[-1]- (NFFT/2)/Fs,f[],f[-1]),interpolation='nearest') subplot(413) imshow(log(p),aspect='auto',origin='lower',extent=(t[]-(nfft/2)/fs,t[-1]- (NFFT/2)/Fs,f[],f[-1]),interpolation='nearest') subplot(414) s_ana = hilbert(s) # sygnał analityczny P,f,t,im2 = specgram(s_ana,nfft = len(h),fs = Fs,window = h, noverlap = 31, sides = 'twosided') imshow(log(p),aspect='auto',origin='lower',extent=(t[]-(nfft/2)/fs,t[-1]- (NFFT/2)/Fs,f[],f[-1]),interpolation='nearest') show() Ćwiczenie: Proszę zbadać rozdzielczość czasową spektrogramu posługując się funkcją delta oraz rozdzielczość częstotliwościową posługując się funkcją sinus (Trzeba przeskanować czas funkcją delta, a częstości sinusem). Proszę wykonać to dla kilku długości okienek h. Proszę zbadać rozdzielczość spektrogramu przy pomocy dwóch funkcji Gabora, dla różnych ich odległości w czasie i w częstości. Zaobserwować strukturę wyrazów mieszanych.

Ciągła transformata falkowa i skalogram Ciągłą transformata falkowa Definicja Ciągła transformacja falkowa (ang. Continuous Wavelet Transform, CWT) dana jest wzorem: gdzie a jest skalą. Od falki wymagamy żeby miała średnią 0. Transformację tę można interpretować jako rzutowanie sygnału na kolejne wersje falki przesunięte o t i przeskalowane o a. Inne spojrzenie na transformację falkową uwidacznia się gdy połączymy dwa powyższe wzory: Tu widać, że dla ustalonej skali a transformacja falkowa jest splotem sygnału z falką o skali a. Ten sposób myślenia o transformacji falkowej umożliwia zastosowanie szybkiego algorytmu obliczeniowego bazującego na tym, że splot w dziedzinie czasu odpowiada mnożeniu w dziedzinie częstości. Skalogram Podobnie jak dla STFT i spektrogramu, możemy dla CWT wprowadzić pojęcie skalogramu, będącego estymatą gęstości energii w przestrzeni czas-skala. Dla falek, które są dobrze skupione wokół częstości dla skali można wprowadzić utożsamienie. Utożsamienie to pozwala przekształcić reprezentację czas-skala w reprezentację czas-częstość:

Implementacja Przykładowa implementacja obliczania skalogramu dla falek Morleta przedstawiona jest poniżej. Korzysta ona z własności splotu. def cwt(x, MinF,MaxF,Fs,w=7.0,df =1.0,plot = True): '''w - parametr falki Morleta, wiąże się z jej częstościa centralną i skalą w następujacy sposób: f = 2*a*w / T gdzie: a-skala, T-długość sygnału w sek.''' T= len(x)/fs M = len(x) t = np.arange(,t,1./fs) freqs = np.arange(minf,maxf,df) P = np.zeros((len(freqs),m)) X = np.fft.fft(x) # transformacja sygnału do dziedziny czestosci for i,f in enumerate(freqs): # petla po kolejnych czestosciach a = T*f/(2*w) # obliczenie skali dla danej czestosci psi = np.fft.fft(ss.morlet(m, w=w, s=a, complete=true)) # transformacja falki Morleta do dziedziny czestosci. W bardziej wydajnym kodzie moznaby zastosowac analityczna postac tej falki w dziedzinie czestosci. psi /= np.sqrt(np.sum(psi*psi.conj())) # normalizacja energii falki CWT = np.fft.fftshift(ss.ifft(x*psi)) P[i,:] = (CWT*CWT.conj()).real if plot: py.imshow(p,aspect='auto',origin='lower',extent=(,t,minf, MaxF)) py.show() return P,f,t Matching pursuit Dopasowanie kroczące (ang. matching pursuit, MP) jest procedurą polegającą na rozłożeniu sygnału na funkcje składowe pochodzące z określonego zbioru funkcji (słownika). Słowniki wykorzystywane w metodach czas-częstość często składają się z funkcji Gabora tj. funkcji sinus modulowanej funkcją Gaussa. MP jest algorytmem iteracyjnym. W pierwszym kroku wybierana jest funkcja dająca największy iloczyn skalarny z sygnałem. W każdym następnym kroku funkcja jest analogicznie dopasowywana do residuum sygnału, pozostałego po odjęciu wyniku poprzedniej iteracji.

Ćwiczenia Zadanie 1 Zadanie 2 Zapoznać się z opisem metod czas-częstość, wykonując polecenia opisane przy każdej z metod. Zbadać własności metod czas-częstość, m.in.: Proszę przyjrzeć się definicjom transformaty falkowej i STFT i opowiedzieć o analogiach i różnicach. Proszę zbadać własności przesunięć w czasie i w częstości dla skalogramu w sposób analogiczny jak było to pokazane dla spektrogramu. Proszę zbadać strukturę wyrazów mieszanych w sposób analogiczny jak było to pokazane dla spektrogramu. Zbadaj działanie algorytmu MP na samodzielnie wytworzonych sygnałach symulowanych: Trzech funkcjach Gabora o różnych częstościach, amplitudach i położeniach w czasie i o podobnej rozciągłości w czasie tak, aby zasadniczo nie nachodziły na siebie (patrz rysunek). Wykonaj dopasowanie dla trzech atomów, narysuj sygnał oryginalny i nałożony na niego sygnał zrekonstruowany z wyliczonych atomów, różnicę tych sygnałów (residuum) oraz mapę czasczęstość. Dwóch jednakowych funkcji Gabora położonych w pewnej odległości od siebie w czasie. Zbadaj jakość dopasowania dokonując rekonstrukcji dwoma i trzema atomami na rysunkach podobnych jak w poprzedniej części zadania. Sprawdź co się dzieje przy zwiększaniu odległości w czasie pomiędzy tymi funkcjami Gabora.

Zadanie 4 Pobrać plik z danymi: https://brain.fuw.edu.pl/~suffa/labeeg/characterize_ch4_f50_g4.mat Opis danych: dane zawierają zapisy z lokalnych potencjałów polowych (LFP) z kory czuciowej małpy podczas podawania bodźca wibracyjnego do palca. Macierz zawiera 50 powtórzeń po 3 sekundy. Częstość próbkowania wynosi 5000 Hz. Bodziec podawany był pomiędzy 1 a 2 sekundą. Analiza zapisów LFP z kory czuciowej małpy podczas podawania bodźca wibracyjnego do palca, o częstości 50 Hz. Mapa czas-częstość przedstawia względną gęstość energii (w skali db) względem okresu referencyjnego 200-50 ms przed początkiem stymulacji. Dane opisane są w pracy: Supratim Ray, Steven S. Hsiao, Nathan E. Crone, Piotr J. Franaszczuk, and Ernst Niebur. Effect of Stimulus Intensity on the Spike Local Field Potential Relationship in the Secondary Somatosensory Cortex. The Journal of Neuroscience, 2008, 28(29):7334-7343. Zadania do wykonania:

Otrzymać mapy czas-częstość dla pojedynczych realizacji a następnie uśrednić je po realizacjach. Na średniej mapie poszukać występowania odpowiedzi w częstościach high-gamma (100-200 Hz). W przypadku braku widocznej odpowiedzi, rozważyć następujące operacje: usunąć częstości sieci (60 Hz i wyższe harmoniczne); zastosować logarytmiczną skalę energii; policzyć zmiany gęstości energii względem jej wartości w okresie referencyjnym. Mapa czas-częstość średniej gęstości energii otrzymaną metodą Matching Pursuit jest przedstawiona na rys. 1. Zadanie 5 Wykonać analizę metodą MP dla danych z zadania 3. Literatura S. Mallat and Z. Zhang (1993) Matching pursuit with time-frequency dictionaries. IEEE Transactions on Signal Processing, 41:3397-3415. Pinsky, Mark (2002), Introduction to Fourier Analysis and Wavelets, Brooks/Cole, ISBN 0-534-37660-6