Z-ANO - České vysoké učení technické v Praze

Transkript

Z-ANO - České vysoké učení technické v Praze
ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE
Fakulta biomedicínského inženýrství
Katedra biomedicínské techniky
Topografické mapování elektrické aktivity mozku
Týmový projekt
Vedoucí projektu: Doc. Ing. Vladimír Krajča, CSc.
Student:
Martin Tuček
leden 2011
Anotace
Topografické mapování mozkové aktivity
Cílem týmového projetu je vytvořit program na moderní zpracování EEG signálu
v jazyce MATLAB. Mým úkolem byla realizace funkce pro topografické mapování mozkové
aktivity. Studoval jsem metody interpolace bodů v rovině i v prostoru a porovnával jejich
výsledky na známém datovém poli. Program jsem navrhl pro základní funkce lineární a
kubické interpolace.
V rámci práce je podrobně popsána všechny funkce vytvořeného
programu.
Annotation
Topographic brain mapping
The aim of this team project is to realize a program for modern EEG processing in
MATLAB. My work was realization of a function for topographic brain mapping. I studied the
mathematical methods of 2D and 3D interpolation and compared it’s results on synthetic
dates. The program is designed for elementary functions as linear and cubic interpolation.
My work covers detailed description of each program function.
Prohlášení
Prohlašuji, že jsem týmový projekt s názvem:
…………………………………………………………………………………………………..
vypracoval(a) samostatně a použil(a) k tomu úplný výčet citací použitých pramenù, které
uvádím v seznamu přiloženém k závěrečné zprávě.
Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č.121/2000 Sb.,
o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů
(autorský zákon).
V ……………. dne ………………
…………………….
podpis
Obsah
Úvod ........................................................................................................................................... 6
1.
Stav současného řešení problematiky ................................................................................ 7
2.
Použité metody (návrh řešení).......................................................................................... 10
3.
4.
2.1.
Lineární interpolace ................................................................................................... 10
2.2.
Kubická interpolace ................................................................................................... 12
2.3.
Nejbližší soused - Nearest neighbour ........................................................................ 13
2.4.
Interpolace sférickými spliny ..................................................................................... 14
Experimentální část........................................................................................................... 15
3.1.
Porovnání vybraných interpolačních metod při plošné projekci .............................. 15
3.2.
Porovnání vybraných interpolačních metod ve 3D ................................................... 16
Realizace programu........................................................................................................... 17
4.1.
Čtení EEG signálu – funkce „cteni.m“ ........................................................................ 17
4.2.
Práce s kurzorem v rámci grafu – funkce „funkceGrafu.m“ .................................. 19
4.3.
Zobrazeni amplitudové mapy signálu EEG – funkce zobrazeni.m ......................... 19
4.4.
Popis funkce slideru – soubor posuvnik.m ............................................................ 22
5.
Závěr.................................................................................................................................. 23
6.
Seznam použité literatury ................................................................................................. 24
7.
Příloha – zdrojový kód programu...................................................................................... 25
7.1.
Zdrojový kód souboru cteni.m ............................................................................... 25
7.2.
Zdrojový kód souboru funkceGrafu.m ................................................................... 26
7.3.
Zdrojový kód souboru zobrazeni.m ....................................................................... 27
7.4.
Zdrojový kód souboru posuvnik.m ........................................................................ 29
Úvod
Výhody počítačového zpracování biosignálů jsou zřejmé a s rostoucím výkonem
počítačů se možnosti programů neustále vyvíjejí. Topografické mapování a zobrazení
mozkové aktivity je i nadále jednou ze základních funkcí moderních programů pro analýzu
EEG. Ve své práci se nejprve zaměřím na způsoby mapování amplitudy biologických signálů.
Vhodné metody dvoudimenzionální interpolace ověřím a porovnám na uměle vytvořených
(syntetických) a především jednoduchých vstupních datech. Výstupem celého projektu bude
program v jazyce MATLAB, který dovede zřetelně vizualizovat EEG data.
Kompletní EEG záznamy ve struktuře diagnostického přístroje BRAIN QUICK od firmy
Micromed, kritiku i cenné rady a poznatky pro mou práci, dodal vedoucího projektu, pan
Doc. Ing. Vladimír Krajča, CSc.
1. Stav současného řešení problematiky
Elektroencefalografie (EEG) se stala standartní klinickou metodou, zkoumající funkci
mozku. V oblasti diagnózy a léčby epilepsie, a stále častěji zkoumání psychických poruch, je
zcela nezastupitelná. Přitom je získání hodnotných dat touto metodou levné a ve srovnání
s dalšími způsoby diagnózy mozku, které využívají radiace i bezpečné. Navíc pro dlouhodobé
záznamy (orientační časy diagnostiky: ambulantní vyšetření- 20min, analýza spánku- 8h,
dlouhodobé analýzy >24h) je elektroencefalograf dobře mobilní. Na druhou stranu čtení EEG
záznamu vyžaduje vysoký stupeň odbornosti. Diagnóza nebyla nikdy jasná a vždy významně
zatížená subjektivním názorem lékaře. Matematika byla pro lidskou analýzu limitující. Proto
přišly na řadu počítače. [1]
Výhody počítačového zpracování biosignálů jsou zřejmé. V prvé řadě digitální data
umožňují dodatečné úpravy a zpracování naměřeného EEG signálu. Snazší ukládání, přenos,
vyhledávání a správu souborů. Dále máme široké možnosti prezentace dat ve statistických
údajích a grafické zobrazení. [2]
Papírové záznamy tyto výhody neměly. Díky potřebě, při vyšetření, zaznamenávat
signály dlouhodobě a povinnosti záznam v nemocnici po mnoho let uchovávat, bylo nutné
pro takový archiv obětovat nemalé prostory. Samotné zpracování naměřených dat bylo často
nazýváno spíš uměním, než vědou. Specialista v oboru, získával své znalosti desítkami let
praxe a jeho drahocenný čas byl plýtván při přebírání diagnosticky nehodnotných dat, navíc
stěžejní matematické operace jako je Fast Fourier transform (FFT) mohl jen těžko provést. Je
nutné zdůraznit, že počítačová zpracování EEG signálu však nikdy neměla v úmyslu roli lékařů
;plně substituovat, dává jim pouze efektivní nástroje pro detailní analýzu. [1]
Prvotním cílem bylo usnadnit lékaři práci základním rozdělením signálu na
diagnosticky hodnotné úseky, například epileptické grafoelementy. S rozvojem metody FFT
lékař obdržel úplně nové údaje o frekvencích, z jakých je EEG signál složen. Tyto hodnoty
díky počítačům získali lékaři v 50. a 60. letech minulého století. Dále se nabízelo, důležitá
data zobrazit na obrazovce počítače. Právě touto problematikou, kterou můžeme shrnout
pod název topografické mapování mozkové aktivity, se v 70. letech 20. století aktivně zabýval
Frank H. Duffy. Svou práci „Brain electrical activity mapping (BEAM)“, ve které poprvé uvedl
mapován elektrické aktivity mozku, vydal v roce 1979. [1,2]
Takzvaný Brain mapping je metodou, s jejíž pomocí můžeme lékaři vhodně
vizualizovat naměřené hodnoty EEG signálu. Plošně, či prostorově (na modelu hlavy) mu
počítač pomáhá, představit si skutečný průběh signálu. Nejde jen o zobrazení amplitudy,
které zkušený odborník zvládne analyzovat z papíru. Reálný problém, který počítače úspěšně
řeší, je zobrazení mapy frekvencí, koherence či kordance. Grafické zobrazení aktivity je pak
velmi jasné a klinicky cenné. [1]
V praxi jde o vhodné uložení naměřených hodnot EEG signálu na jejich místa
v základní 2D matici. Nejlépe pak rozložením dle systému 10/20. Při plošném zobrazení
dostačuje rozměr 128x128 obrazových bodů tedy celkový počet 16384 pixelů. Svodů EEG
bývá 8-128, nejvíce pak 256, nejčastěji však 21. Reálně naměřených hodnot je v klasickém
21svodém EEG 19, protože poslední dva svody A1 a A2, spojující obě uši, jsou referenční.
Máme tedy 19 bodů s naměřenými hodnotami, umístěných podle systému 10/20 a dalších
16365 jich musíme dopočítat. K tomu používáme různé interpolační metody, které
odhadnou hodnoty signálu v místech, kde jsme EEG neměřili. Interpolací získáme obraz
kontinuálního průběhu mozkové aktivity. Číselným hodnotám následně přiřadíme odstín
barevné škály. Plošná barevná mapa je pak mnohdy daleko výmluvnější, než signál EEG. [1,4]
Epileptické grafoelementy 2D amplitudovou mapou vhodně nezobrazíme, lépe jsou
tak výrazné změny vidět přímo v elektroencefalogramu. Pro analýzu epileptických dipólů je
vhodnější 3D nadstavba základního Brain mappingu. Získanou EEG mapu v tom případě
deformujeme na povrch modelu lebky. Programy běžně nabízejí možnost pohled na tuto
mapu měnit ve všech úhlech.[3]
Taková EEG analýza ale stále nepodává informace o fyziologii signálu, ani anatomii
mozku. Nejhodnotnější výsledky studia dipólů, jakých lze mapováním v současné době
dosáhnout nabízí systém LORETA (Low Resolution Brain Elektromagnetic Tomography). Jde o
zobrazení, které publikoval R. Pascual-Marqui ve své práci „Low resolution electromagnetic
tomography: a new method for localizing electrical activity in the brain“ v roce 1994. LORETA
zaručuje „exact, zero error localization“, tedy lokalizaci zdrojů EEG signálu s nulovou chybou.
Dívá se na problém mapování z druhé strany a hledá prostorovou orientaci a sílu generátorů
snímané aktivity. Vypočítáváme elektrický potenciál, který vytvářejí neurony ve chvílích, kdy
jejich axony prochází proud. Právě tento proud je stěžejní při zkoumání mozku
v elektroencefalografii. Vznikající potenciál se šíří přes buněčné membrány, elektricky
vodivou extracelulární tekutinu, mozkové obaly a lebku až na pokožku. V těchto strukturách
dochází k útlumu, který roste se vzdáleností a tloušťkou jednotlivých vrstev.
Vyšetření EEG můžeme kombinovat s výsledky počítačové tomografie (CT) a
magnetické rezonance (MRI), které nám dávají strukturální údaje o mozku a lebce. Informaci
o funkci mozku poskytují metody pozitronové emisní tomografie (PET) a jedno fotonová
emisní tomografie (SPECT).[1,2]
2. Použité metody (návrh řešení)
Základní metody interpolace dělíme podle počtu dimenzí na plošné a prostorové.
Mezi 2D interpolační metody zahrnujeme především metodu lineární a kubickou. Prostorová
interpolace EEG dat je prováděna zejména pomocí sférických splinů. Interpolace v obou
dimenzích zvládne metoda nejbližšího souseda (nearest neighbour).
2.1.Lineární interpolace
Lineární interpolace je základní a nejjednodušší metodou, jakou můžeme získat
souvislý průběh hodnot v prostoru, kde známe jen některé hodnoty. Výsledkem lineární
interpolace dvou bodů je rovná přímka, interpolace třech a více bodů dává rovinu.
Podívejme se nejprve na způsob lineární interpolace 2 bodů. Mezi hodnotami Y0 a Y1 bodů
A a B na následujícím schématu (obr.1) hledáme hodnotu Y bodu C. Platí rovnice(1,2):[5,6]
B
(
)
(
(
C
)
)(
)
A
(1,2)Rovnice pro lineární interpolaci dvou bodů
(obr.1) Schéma lineární interpolace dvou bodů*6+
Lineární interpolace dat ve 2D prostoru je podobně jednoduchá. Opět v ní dochází
k rovinnému propojení známých bodů. V matici dat děláme výpočty „do kříže“. Ze 4 hodnot
ve čtverci vypočítáme aritmetickým průměrem hodnotu prostřední (ve schématu značeno
červeně). To provedeme pro všechny hodnoty v matici a máme hotovou nejjednodušší
jednonásobnou interpolaci původní matice. Při prvotním rozměru 5x5 získáváme z 25 bodů
41 bodů. Další stupeň interpolace znamená průměrováním 4 hodnot v nově vzniklých
čtvercích (tvoří je 2 body původní a dva body nové – značeno zeleně na schématu (obr.2)).
(obr.2) Schéma lineární interpolace 2D pole
Tím bychom ještě hotovi nebyli. Při zachování tohoto postupu by se hodnoty na kraji
matice neinterpolovaly. Na okraji pole tedy hodnotu signálu zrcadlíme a do průměru
započítáváme 2x (dle následujícího schématu (obr.3)).
(obr.3) Schéma lineární interpolace okrajů 2D pole
Okamžitý výpočet určité hodnoty bodu P v prostoru 4 bodů hodnot Q11 ,Q12 ,Q21 ,Q22
(podle schématu (obr.4)) provádíme podle následujících vztahů(3,4,5):[5,6]
Nejprve interpolujeme X-ové souřadnice tímto způsobem:
(
)
(
)
(
) (3)
(
)
(
) (4)
Kde R1=(x,y1)
(
)
Kde R2=(x,y2).
Následně provedeme interpolaci podle Y souřadnice:
( )
(
)
(
)
(5)
(obr.4) Schéma pro interpolaci 2D pole [6]
Tímto výpočtem získáme požadovaný odhad hodnoty na pozici bodu P.
Velikost matice NxN roste z původního N po každé interpolaci na velikost 2*N-1,
počet prvků pole potom stoupá s každou interpolací skoro 4x. Typický výstup lineární
interpolace známého pole 3x3 po devítinásobné lineární interpolaci je na (obr.5):
Původní (interpolovaná) matice:
(obr.5) Výsledek 9x lineární interpolace známého pole.
Původní matce 3x3 po 9x lineární interpolaci nabyla na velikost 1025x1025, tedy o
více jak milion hodnot.
Z obrázku je vidět typická chyba této metody. Průměrováním hodnot matice v kříži a
především rovinnou aproximací bodů matice za vzniku „pyramid“ se ve výsledné mapě
zobrazuje kříž.
2.2.Kubická interpolace
Další možností, kterou máme, je kubická interpolace. Je to druhá nejrozšířenější
technika aproximace hodnot po lineární interpolaci. V pořadí druhá nejjednodušší metoda,
už nemá rovinný průběh, ale udržuje kontinuitu tvaru funkce a její první derivace. Zatím, co
lineární interpolace uvažuje jen 4 nejbližší hodnoty, kubická zahrnuje i hodnoty v těsné
blízkosti 4 interpolovaných bodů. Rovnice výpočtu je tedy 4x delší a bodů pro analýzu je
celkem 16. Na krajích matice okolí hodnoty algoritmus většinou odhaduje, aby měl potřebné
údaje o sklonu a mohl na něj navázat průběh křivky.[7]
V prostoru 4x4 algoritmus vypočítá 1D kubickou interpolaci ve směru všech 4
sloupců, potom počítá jejich horizontální interpolaci ve směru řad (kolmo na již vypočítané
aproximace). Výpočet 1D kubické interpolace, pro prostor mezi každými 2ma body vychází
z rovnic křivky (6) a její derivace(7):[9]
( )
(6)
̀( )
(7)
Hodnoty výše uvedené funkce i její derivace jsou pro x=0 a x=1 známé.
( )
( )
̀( )
̀( )
2 parametry c a d už máme určené, další dva a a b vyjádříme:
( )
( )
( )
( )
̀( )
̀( )
̀( )
̀( )
Tím jsme zvládli vypočítat 1D kubickou interpolaci, jejímž opakováním získáme 2D
kubicky interpolovanou plochu. Výpočet jediné přesné hodnoty přímo, je ve 2D prostoru
dost složitý a řeší ho polynom o šestnácti členech, zapsaný zkráceně vztahem (8):[8]
(
)
∑
∑
(8)
Výsledek této metody je v porovnání s výsledky lineární interpolace hladší a netrpí
artefakty v podobě výrazného kříže. Uvádím zobrazení 2D průběhu hodnot pro stejnou
matici, jakou jsem použil pro vizualizaci výsledků lineární interpolace (obr.6):
Původní (interpolovaná) matice:
(obr.6) Výsledek 9x kubické interpolace známého pole.
Rozměry výsledných matic po lineární i kubické interpolaci se shodují.
Právě tyto dvě metody a jejich porovnání byly hlavní částí mého experimentu,
kterému se budu věnovat v další kapitole.
2.3.Nejbližší soused - Nearest neighbour
Vůbec nejjednodušší metoda, používaná jako součást ostatních metod je metoda
nejbližších sousedů. Její algoritmus vyhledává pro neznámý bod známou hodnotu nejbližšího
souseda a přiřazuje ji interpolovanému místu. Výsledkem takové interpolace je schodovitý
obrazec s ostrými hranami. Postup je velice rychlý a používá se například při 3D
renderováním složitých povrchů pro získání předběžné bravy textury. [10]
Následující obrázek prezentuje výsledek interpolace nejbližších sousedů na známé
matici dat (obr.7):
Původní (interpolovaná) matice:
(obr.7) Výsledek 9x interpolace nejbližších sousedů pro známé pole.
Bod interpolovaný touto metodou má přiřazenu hodnotu nejbližšího známého bodu.
Tedy při rozměru finální matice 1025x1025 má ještě člen (256,256) hodnotu 0 a člen
(257,257) hodnotu 1.
2.4.Interpolace sférickými spliny
Zřejmou nevýhodou všech dosud uvedených způsobů interpolací je následující
nepřesnost: Maximální hodnoty se vyskytují pouze v měřených místech (pod elektrodami).
Tento problém řeší právě sférický spline, nekonečně tenká plocha, kterou vyhlazujeme =
ohýbáme – interpolujeme data. Povrch je interpolován po dílčích částech mezi uzlovými
místy. Výraz spline interpolace minimální křivosti vychází z následujících dvou podmínek pro
interpolant: Povrch splinu musí procházet uzlovými místy a musí mít minimální křivost. Tato
interpolace je zvlášť vhodná pro použití na relativně hladkých površích, protože rychlé změny
hodnot datových bodů vedou při použití této metody k větším nepřesnostem. [1,11]
Tento způsob interpolace je značně složitý. Hlubší popis této metody je mimo rozsah
mé nynější práce.
3. Experimentální část
V rámci experimentální části teamového projektu jsem se zaměřil na porovnání
interpolačních metod používaných v mém programovém prostředku pro topografické
mapování mozkové aktivity. Pro jejich výkonnost a také nenáročnost jsem si vybral metody
lineární a kubické interpolace.
3.1.Porovnání vybraných interpolačních metod při plošné projekci
Výstup prvního experimentu, kterým bylo porovnání map vzniklých interpolací
syntetické – uměle vytvořené a především jednoduché matice, jsem už uvedl v rámci popisu
obou metod. Jako vstupní matici jsem použil pole 3x3 naplněné nulami, do jeho středu pak
umístil hodnotu. Pro názornost přikládám oba výstupy vedle sebe (obr.8):
lineární interpolace
kubická interpolace
referenční spektrum
(obr.8) Zleva lineární interp., kubická interp., vpravo pod sebou spektrum lineární interp., kubické interp. a referenční
Na vizualizovaných datech je vidět nezanedbatelný rozdíl výsledků obou metod.
Lineární interpolaci charakterizuje významný kříž a rovnoměrný průběh spektra. U kubické
interpolace se bod správně interpoluje do téměř pravidelných kruhů, ve spektru je ale silně
zvýrazněna maximální hodnota (červená barva, přiřazená hodnotám vyšším než 0,66 zabírá
více než polovinu šířky obrázku, což ukazuje na plochost zobrazení v okolí peaku pole). Tento
zajímavý výsledek můžeme srovnat na trojici spekter vlevo. Jsou to vybrané úseky od středu
interpolovaného pole (hodnoty 1) ke kraji interpolovaného pole (hodnotě 0). Je vidět, že po
lineární interpolaci je jeho průběh podobný referenčnímu spektru, zobrazenému pro uměle
zadaný vektor (interval <1,0>). Příčiny chyb lépe odhalí zobrazení map ve 3D.
Porovnání vybraných interpolačních metod ve 3D
Pro analýzu získaných matic ve 3D využijeme hodnoty interpolovaných bodů matice,
jako 3. rozměr (obr.9).
(obr.9) Vlevo lineární interp., vpravo kubická interp., pod sebou pohledy z úhlu 45° a boční náhledy
Výsledky jasně ukazují důvod křížového efektu u lineární interpolace, kdy mají
hodnoty matice tvar čtyřbokého jehlanu. Křivky vypočtené při kubické interpolaci jsou
jasným důvodem pro deformaci barevného spektra při pohledu shora.
Na profilu kubické interpolace je vidět vznik 4 „postranních laloků“, kde hodnoty
klesají na hodnotu -0,125, přestože původní matice měla nejnižší hodnotu 0. Tato chyba je
způsobena právě snahou interpolace udržet kontinuitu tvaru funkce a její první derivace. Pro
porovnání uvádím v jednom grafu průběhy funkcí při bočním pohledu (obr.10).
(obr.10) Srovnání profilů interpolací
Červeně – kubická, modře – lineární interpolace
4. Realizace programu
Samotný program pro topografické mapování mozkové aktivity jsem rozdělil několik
funkčních bloků. Jednotlivé funkce se navzájem volají a předávají si přímo, nebo nepřímo
proměnné. Zatím řeším jen zobrazení amplitudy signálu, po odladění stěžejní části
zdrojového kódu – zobrazení, pak nebude problém přidáním další funkce zobrazovat i data
frekvencí, koherence či kordance. V prostředí MATLAB jsem se snažil využívat
implementované funkce programu.
4.1.Čtení EEG signálu – funkce „cteni.m“
Program je vytvořen pro práci se soubory s příponou „.trc“, datové struktury BRAIN
QUICK firmy Micromed. Tyto soubory mají jednoduchou datovou strukturu, primárně
rozdělenou na dvě části hlavičku (header) a datovou oblast (trailer). Header obsahuje
informace o nastavení elektroencefalografu, pořadí elektrod, pacientovi i datové oblasti,
v traileru jsou pak za sebou poskládány naměřené hodnoty.
Nejdůležitější matlabovské příkazy, používané pro čtení EEG dat jsou: fopen, fseek
a fread. První v pořadí znamená „otevři soubor“. Její zápis je následující:
eeg = fopen('alban.trc','r');
Soubor s názvem alban.trc, musí být v tomto případě uložený přímo ve složce
programu. ‘r’ je pak nastavení oprávnění uživatele pro čtení – read. Na výběr jsou krom
jiného oprávnění pro zápis do souboru ‘w’ – write a pro zápis dat na konec souboru ‘a’. Při
dalším použití příkazu fopen využívám už substituce „eeg“.
Příkaz fseek pak znamená „kurzor posuň na pozici X“.
fseek(eeg,8,'bof');
Výše uvedený řádek programu posouvá kurzor na adresu 8. bytu. Z informací o
struktuře souboru vím, že údaj o samplovací frekvenci je právě na pozici bytu 8-9. Parametr
‘bof‘ pak znamená beginning of file. MATLAB tedy posune kurzor na určenou pozici,
počítanou od začátku souboru. Pohyb můžeme nastavit z aktuální pozice kurzoru ‘cof’ nebo
od konce ‘eof’.
Samotnou binární informaci z vyhledané pozice přečteme příkazem fread a
uložíme pod příslušnou proměnnou „samplingRate“. V rámci tohoto příkazu definujeme
počet bytů, které chceme číst do mezipaměti a následně je uložit do proměnné ve
specifikovaném formátu. V tomto případě se hodí formát ‘short’ – 16bitový integer.
samplingRate = fread(eeg,1,'short');
Toto jsou nejdůležitější příkazy použité v programové funkci cteni.m. S jejich pomocí
postupně načítám informace o vzorkovací frekvenci – samplingRate, maximálním rosahu
hornot signálu v jednotkách µV maxGain, adrese počátku datové části – dataStart, počtu
kanálů – channels a celkovém počtu samplů – samples.
Data jsou následně přepočtena na hodnoty v µV a uložena spolu s informací o jejich
počtu do souboru data.mat, pro použití v dalších částech programu. Zobrazení prvních 4
kanálů je pouze pro účely výběru samplu kurzorem (volaný na konci souboru cteni.m
příkazem „funkceGrafu“). Po napojení programu na programovou část umožňující čtení a
zobrazení EEG signálu, bude funkce souboru cteni.m a funkceGrafu.m nahrazena.
(obr.11) Okno zobrazené po průběhu funkce cteni.m
4.2. Práce s kurzorem v rámci grafu – funkce „funkceGrafu.m“
Do okna figure, kde vykresluji grafy průběhu EEG, bylo nutné přidat funkci kurzoru
pro výběr jednotlivých samplů, pro následnou vizualizaci naměřených potenciálů. Na začátku
kódu je definován posluchač událostí pro kliknutí myší – WindowButonDownFcn. Dále se
definují proměnné channels – počet zobrazených grafů, currentAxes – vodící čára ve figure a
formát popisku kurzoru - descriptions. Po kliknutí myší probíhá funkce clickFcn. Rozhoduje,
jestli objekt, na který bylo kliknuto je figure. Pokud ne, linka kurzoru i její popisek mají
hodnotu NaN. Pokud ano, program si zapamatuje pozici myši do proměnné position a
přesune na to místo linku kurzoru. Pokud bylo kliknuto do oblasti dat v grafu (v MATLABu je
po přiblížení okrajových částí možné dostat se mimo oblast zobrazení hodnot), příkaz interp1
určí lineární interpolaci hodnot nejbližších 2 naměřených dat a zobrazí popisek =
souřadnice*X,Y+.
Pokud vše proběhlo v pořádku, proměnná success má hodnotu 1 a dojde k volání
funkce zobrazeni.m, které je předána X-ová souřadnice aktuální pozice linky kurzoru.
(obr.12) Kurzor s popiskem, jako výsledek funkce funkceGrafu.m
4.3. Zobrazeni amplitudové mapy signálu EEG – funkce zobrazeni.m
Funkce zobrazeni.m dostává na vstupu informaci o čísle vybraného samplu. Příkaz
load načte soubor data.mat, ve kterém jsou uloženy záznamy ze všech svodů EEG. Následně
dojde k vybrání příslušného sloupce v souboru data.mat podle hodnoty samplu a uložení
hodnot do vektoru dEEG. Ukládání těchto hodnot se děje až od 2. řádku souboru data.mat
(na prvním je obdélníkový signál kalibrační elektrody). Hodnoty vektoru dEEG pak správně
naplníme do matice mEEG.
Pro správnou interpolaci potřebujeme mít definovány hodnoty v celém poli matice
mEEG 5x5. Naměřených hodnot EEG je ale pouze 19 (dle rozložení EEG elektrod). V místech
(X), kde měření chybí, hodnotu dopočítáme jako vážený aritmetický průměr hodnot A,B,C–
v rozích matice (resp. A,B,C,D,E – ve středu horní a spodní strany čtvercové matice). Váha
bude a = vzdálenost hodnoty od vypočítávaného místa. Výpočet je dle rovnice(8) a schématu
(obr.13) :
a=1
(
√
)
(8)
Vypočítali jsme hodnotu pro 4 rohy matice.
(obr.13) Schéma výpočtu chybějících hodnot matice (podle zobrazeni.m)
Při výpočtu chybějících hodnot uprostřed horní a spodní strany čtverce zahrnujeme 5
okolních hodnot a celý zlomek pak dělíme 5. Tímto získáme pole 5x5, které lze interpolovat.
Experimentální výsledky ukázaly, že elektrody na obvodu matice jsou v konečné
vizualizace pro pole 5x5 špatně viditelné. Významné zlepšení přineslo zvětšení původního
pole na rozměr 7x7, jak ukazují následující vizualizace na reálných datech (obr.14):
(obr.14) Srovnání interpolace pole o původní velikost 7x7 a 5x5
Zvětšení matice je zahrnuto ve funkci zobrazeni.m prostým přeindexováním ve FOR
cyklu na řádcích 28-35. Samotnou interpolaci provádím pomocí matlabovské funkce interp2:
iEEG = interp2 (vetsEEG, 5, 'cubic');
Výše uvedený příkaz uloží do pole iEEG 5x kubicky interpolovanou matici vetsEEG.
Metodu interpolace můžeme měnit na hodnoty ‘nearest’ – metoda nejbližších sousedů,
‘linear’ – metoda lineární a ‘cubic’ – metoda kubická.
Funkce dále pokračuje úpravou uživatelského rozhraní. Zobrazením user interface
typu Text, ve kterém se vedle popisu elektrody zobrazí přesná hodnota naměřeného
potenciálu. Interpolovaný obraz iEEG vykreslí příkaz imshow:
imshow(iEEG(16:177, 16:177));
Má stanovené hranice, díky kterým dojde k ořezu větší části uměle vytvořených
okrajů zvětšené matice (nepotřebných dat). Aby obraz vypadal reálněji a uživatel nebyl
rozptylován syntetickými hodnotami v rozích matice, je přes mapu překreslen kruh příkazem
rectangle [1 1], který zakrývá krajní hodnoty obrazového pole. Limity barevné škály CLim se
samy aktualizují podle nejnižší a nejvyšší hodnoty zobrazovaného samplu (matice mEEG).
set(gca, 'CLim', [min(min(mEEG)) , max(max(mEEG))]);
(obr.15) Topografické mapa průběhu amplitudy signálu EEG po průběhu funkce zobrazeni.m
4.4. Popis funkce slideru – soubor posuvnik.m
User interface slider má optimalizované nastavení podle našich potřeb. Především
jeho rozsah je po celé délce záznamu – v tomto případě 64000 samplů, jeden krok je roven 1
samplu. Při spuštění funkce se definuje proměnná lastVal, do které se uloží poslední hodnota
samplu. Po kliknutí na šipky posuvníku, nebo jeho přesunu myší dojde k volání funkce
sliderCallback. V případě, že se aktuální hodnota polohy slideru currentVal změnila oproti
lastVal, dojde k aktualizaci mapy novým voláním funkce zobrazeni.m.
5. Závěr
Topografický brainmapping je důležitý prostředek analýzy EEG signálu. Věrohodnost
zobrazení je silně závislá na použitém způsobu interpolace. Lineární aproximace bodů
ztrácí návaznost na hranicích interpolovaných segmentů, bubická interpolace není dost
pružná při zobrazení rychlých změn. V mém případě určitá nepřesnost vzniká už při
definici zkoumaného pole, které není dle standartu 10/20, tedy uprostřed horní a spodní
strany čtverce je průměrovaná hodnota navíc.
Mez trváním výpočtu pole jednotlivými metodami není významný časový rozdíl.
Dnešní počítače mají dostatečný výkon pro tyto výpočetní procesy, což ale nevylo vždy
pravidel a kritérium výkonu limitovalo kvalitu, či rychlost zobrazení.
Seznámil jsem se s danou problematikou a postupně nacházel nedostatky, inspiraci
pro další vylepšení algoritmu, kterým se hodlám dále věnovat. Budu se snažit upravit
rozmístění elektrod na poli dle standartu 10/20. Chtěl bych vylepšit statistické porovnání
použitých způsobů interpolace. V rámci souboru zobrazeni.m dát uživateli možnosti,
volby interpolační metody i počtu jejího opakování, změny barevného spektra.
6. Seznam použité literatury
[1]
KRAJČA, Vladimír, MOHYLOVÁ, Jitka, Číslicové zpracování neurofyziologických
signálů. 1. vydání. Praha: Česká technika – nakladatelství CVUT, 2011. ISBN 978-80-01-04721-7.
[2]
INFANTOSI, A.F.C., ALMEIDA, A.C.G., A microcomputer-based system for mapping
EEG signals after source derivation. Colloquium in South America 1990, 1990, s. 22-27. ISBN 087942-610-1.
[3]
SCHLITT, H.A., HELLER, L., AARON, R., BEST, E., RANKEL, D.M., Evaluation of
boundary element methods for the EEG forward problem: effect of linear interpolation. Biomedical
Engineering, IEEE Transactions on, 1995, vol. 42, no. 1, s. 52-58. ISSN 0018-9294.
[4]
McALLISTER, H.G., McCULLAGH, P.J., AYRE, J., A Parallel Implementation Of
Interpolation Algorithms For EEG Potentials. Engineering in Medicine and Biology Society,
Proceedings of the Annual International Conference of the IEEE, 1991, vol.13, s.462-463. ISBN: 07803-0216-8
[5]
KILDNER, D., DOREY, M., DEREK S., What's the Point? Interpolation and
Extrapolation with a Regular Grid DEM, Proceedings of the 4th International Conference on
GeoComputation, GeoComputation CD-ROM. Virginia, 1999. ISBN 0-9533477-1-0
[6]
Wikipedia
[online].
Bilinear
interpolation,
[cit.
02.01.2012+.
Dostupná
z: http://en.wikipedia.org/wiki/Bilinear_interpolation.
[7]
RUSSELL, W.S. Polynomial Interpolation Schemes for Internal Derivative Distributions on
Structured Grids, Applied Numerical Mathematics, 1995, vol. 17, s. 129-71.
[8]
Wikipedia
[online].
Bicubiq
interpolation,
*cit.
02.01.2012+.
Dostupná
02.01.2012+.
Dostupná
z: http://en.wikipedia.org/wiki/Bicubiq_interpolation.
[9]
Paulintnernet
[online].
Cubic
interpolation,
*cit.
z: http://www.paulinternet.nl/?page=bicubic.
[10]
Wikipedia
[online].
Nearest
neighbour,
*cit.
02.01.2012+.
Dostupná
z: http://en.wikipedia.org/wiki/Nearest-neighbor_interpolation .
[11]
ASG SAV SK. KADLÍČKOVÁ J., Testování a výběr interpolačních metod DMR v závislosti na
typu georeliéfu , Geomorphologia Slovaca et Bohemica, 2007, vol. 2, s. 14-18.
7. Příloha – zdrojový kód programu k 2.1.2012
7.1. Zdrojový kód souboru cteni.m
clc, clear;
%nacteni vsech dat ze souboru alban.trc.
eeg = fopen('alban.trc','r');
%nacteni informace o samplovaci frekvenci.
fseek(eeg,8,'bof');
samplingRate = fread(eeg,1,'short');
%nacteni informace o maximu.
fseek(eeg,12,'bof');
maxGain = fread(eeg,1,'short');
%nacteni informace o umístění zacatku EEG dat v binárním souboru.
fseek(eeg,182,'bof');
dataStart = fread(eeg,1,'short');
%nacteni informace o poctu kanalu.
fseek(eeg,184,'bof');
channels = fread(eeg,1,'short');
%nacteni informace o celkovem poctu samplu.
fileInfo = dir('alban.trc');
samples = (fileInfo.bytes - dataStart)/channels;
%nacteni dat do matice "data" (cte 20 kanalu = matice20rad*64000sloupcu).
fseek(eeg,dataStart,'bof');
data = fread(eeg,[20,samples],'uint8');
%zmena dat v matici do jednotek "uV" a jejich posunuti na ose Y.
dataUV = (((data-samplingRate)/(2*samplingRate-0))*maxGain);
%ulozeni matice EEG "dataUV" a poctu samplu "samples" do souboru data.mat
%data budou dale vyuzivana v dalsich funkcich
savefile = 'data.mat';
save(savefile, 'dataUV','samples');
%vykresleni a pojmenovani grafu.
subplot(4,1,1), plot(dataUV(1,:)); %muzeme vykreslit vice grafu do jednoho
okynka pouzitim ,hold, plot(dataUV(2,:))....;
title('channel0');
subplot(4,1,2), plot(dataUV(2,:));
title('channel1');
subplot(4,1,3), plot(dataUV(3,:));
title('channel2');
subplot(4,1,4), plot(dataUV(4,:));
title('channel3');
xlabel('Kliknete na graf pro zobrazeni amplitudove
mapy','FontWeight','bold');
%prikaz spusti funkci pro funkcni kurzor v grafu
funkceGrafu;
7.2. Zdrojový kód souboru funkceGrafu.m
function funkceGrafu
% posluchac udalosti pro graf
set(gcf, 'WindowButtonDownFcn', @clickFcn);
% najde vsechny kanaly
channels = findobj(gcf, 'type', 'line');
% popisky pro jednotlive kanaly (zobrazi se az po kliknuti mysi)
descriptions = nan(1, length(channels));
for i = 1:length(channels)
descriptions(i) = text(NaN, NaN, '','Parent', get(channels(i),...
'Parent'), 'BackgroundColor','yellow','Color', get(channels(i), 'Color'));
end
% vodici cary pro vybrany sample
axes = findobj(gcf, 'Type', 'axes');
currentAxes = nan(1, length(axes));
for i = 1:length(axes)
currentAxes(i) = line([NaN NaN], ylim(axes(i)),'Color', 'black',...
'Parent', axes(i));
end
% stisknuti tlacitka mysi
function clickFcn(varargin)
% pokud uzivatel kliknul mimo 'figure'
if strcmpi(get(gco, 'type'), 'figure')
set(currentAxes, 'XData', [NaN NaN]);
set(descriptions, 'Position', [NaN NaN]);
% pokud uzivatel klikne do 'figure'
else
success = 0;
% pozice mysi
position = get(gca, 'CurrentPoint');
% upraveni pozice vodicich car
set(currentAxes, 'XData', [position(1), position(1)]);
% upraveni popisku
for i = 1:length(channels)
% rozsah kanalu na ose x
xdata = get(channels(i), 'XData');
% rozsah kanalu na ose y
ydata = get(channels(i), 'YData');
if position(1) >= xdata(1) && position(1) <= xdata(end)
success = 1;
y = interp1(xdata, ydata, position(1));
set(descriptions(i), 'Position', [position(1), y],...
'String', sprintf('(%0.0f, %0.2f)', position(1), y));
else
set(descriptions(i), 'Position', [NaN NaN]);
end
end
if success
% spusti funkci "zobrazeni", jako argument predava cislo
% vybraneho samplu
figure;
zobrazeni(uint16(position(1,1)));
end
end
end
end
7.3. Zdrojový kód souboru zobrazeni.m
function zobrazeni(sample)
% Nacteni souboru s EEG daty "dataUV" a celkovym poctem samplu "samples"
load data.mat
posuvnik(sample)
% Nacteni vybraneho sloupce hodnot v matici dat eeg
for i=1:19
dEEG (i)= dataUV(i+1,sample)';
end
% Naplneni vektoru do matice pro interpolaci (chybejici maji hodnotu 0)
mEEG = [ 0 ,dEEG([1]) ,0 ,dEEG([2]) ,0 ;
dEEG([5 3 7 4 6]);
dEEG([16 8 10 9 17]);
dEEG([18 11 13 12 19]);
0 ,dEEG([14]) ,0 ,dEEG([15]) ,0 ;
];
% Dopocteni chybějících hodnot v rozích (vážený průměr 3 okolních hodnot)
v=1/sqrt(2);
mEEG(1)=(mEEG(2)+mEEG(6)+v*(mEEG(7)))/3;
mEEG(5)=(mEEG(4)+mEEG(10)+v*(mEEG(9)))/3;
mEEG(21)=(mEEG(22)+mEEG(16)+v*(mEEG(17)))/3;
mEEG(25)=(mEEG(24)+mEEG(20)+v*(mEEG(19)))/3;
% Dopocteni hodnot ve středu horní a dolní strany
mEEG(11)=(mEEG(12)+mEEG(16)+mEEG(6)+v*(mEEG(7)+mEEG(17)))/5;
mEEG(15)=(mEEG(14)+mEEG(20)+mEEG(10)+v*(mEEG(9)+mEEG(19)))/5;
% Zvetseni matice dat na kazde strane o jednen prvek (kvuli deformaci)
vetsEEG=zeros(max(size(mEEG))+2);
for i=1:(max(size(mEEG)))
for j=1:(max(size(mEEG)))
vetsEEG(1+i,1+j)=mEEG(i,j);
end
end
% Spusteni interpolace 5x
iEEG = interp2 (vetsEEG, 5, 'spline');% parametr 'linear' nebo 'cubic'
% Zobrazeni udaju na jednotlivych kanalech
format = ' = %0.2f';
width = 0.12;
height = 0.03;
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.95 width height],'Style','text','String',
sprintf(strcat('FP1',format),mEEG(6)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.90 width height],'Style','text','String',
sprintf(strcat('FP2',format),mEEG(16)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.85 width height],'Style','text','String',
sprintf(strcat('F7',format),mEEG(2)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.80 width height],'Style','text','String',
sprintf(strcat('F3',format),mEEG(7)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.75 width height],'Style','text','String',
sprintf(strcat('Fz',format),mEEG(12)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.70 width height],'Style','text','String',
sprintf(strcat('F4',format),mEEG(17)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.65 width height],'Style','text','String',
sprintf(strcat('F8',format),mEEG(22)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.60 width height],'Style','text','String',
sprintf(strcat('T3',format),mEEG(3)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.55 width height],'Style','text','String',
sprintf(strcat('C3',format),mEEG(8)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.50 width height],'Style','text','String',
sprintf(strcat('Cz',format),mEEG(13)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.45 width height],'Style','text','String',
sprintf(strcat('C4',format),mEEG(18)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.40 width height],'Style','text','String',
sprintf(strcat('T4',format),mEEG(23)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.35 width height],'Style','text','String',
sprintf(strcat('T5',format),mEEG(4)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.30 width height],'Style','text','String',
sprintf(strcat('P3',format),mEEG(9)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.25 width height],'Style','text','String',
sprintf(strcat('Pz',format),mEEG(14)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.20 width height],'Style','text','String',
sprintf(strcat('P4',format),mEEG(19)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.15 width height],'Style','text','String',
sprintf(strcat('T6',format),mEEG(24)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.10 width height],'Style','text','String',
sprintf(strcat('O1',format),mEEG(10)));
uicontrol('HorizontalAlignment','left','Units', 'normalized',
'Position',[0.01 0.05 width height],'Style','text','String',
sprintf(strcat('O2',format),mEEG(20)));
% Zobrazeni interpolovaneho iEEG s legendou a nastavenou max a min hodnotou
amplitudy
imshow(iEEG(16:177, 16:177));
nadpis=sprintf('Vidite slide cislo = %0.0f',sample);
title(nadpis);
% rectangle ('position', [1, 1, 161, 161], 'curvature', [1, 1],
'LineWidth',40)
rectangle ('position', [-16, -16, 196, 196], 'curvature', [1, 1],
'LineWidth',62,'EdgeColor',[0.80 0.80 0.80])
set(gca, 'CLim', [min(min(mEEG)) , max(max(mEEG))]);
colormap(jet(19));
colorbar;
7.4. Zdrojový kód souboru posuvnik.m
function posuvnik (sample)
% vytvoreni GUI komponenty slider
slider = uicontrol('Style', 'slider','Units', 'normalized', ...
'Position', [0 0 1 0.03],'Min', 1,'Max', 64000,'Value',
sample,'SliderStep',[0.00001 0.01], 'Callback',@sliderCallback);
% promenna, ve ktere je uchovana posledni hodnota slideru
lastVal = get(slider, 'Value');
function sliderCallback(slider,event)
currentVal = get(slider, 'Value');
if currentVal ~= lastVal
lastVal = currentVal;
sample = uint16(lastVal);
zobrazeni(sample);
end
end
end

Podobné dokumenty

Využití Hilbert-Huangovy transformace při detekci patologické

Využití Hilbert-Huangovy transformace při detekci patologické otestovali jej na připravených datech. K dispozici byli data dvou pacientů trpících epilepsií s označenými HFO segmenty. Při nastavování parametrů detektoru jsme se zaměřili na rozumný poměr senzit...

Více

8. Grafické uživatelské rozhraní

8. Grafické uživatelské rozhraní Následující obrázky ukazují dva různé vzhledy téže aplikace v závislosti na tom, jak si uživatel nastaví velikost okna.

Více

oVirt - virtualizace datacentra aneb správa

oVirt - virtualizace datacentra aneb správa base=2013-10-08T12:16:16,driftfix=slew -no-shutdown -device piix3-usbuhci,id=usb,bus=pci.0,addr=0x1.0x2 -device virtio-serial-pci,id=virtioserial0,bus=pci.0,addr=0x4 -drive if=none,media=cdrom,id=d...

Více

MATLAB ver. 5

MATLAB ver. 5 Převody číselných soustav MATLAB poskytuje funkce, které umožňují převádět desítkovou číselnou soustavu na řadu jiných a naopak. dec2bin, bin2dec dec2hex, hex2dec dec2base, base2dec Maximální zákl...

Více

Toto

Toto pcolor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Více

zde - MH Consulting sro

zde - MH Consulting sro klinické ani farmakokinetické studie nebyly provedeny. Omezené literární údaje naznačují, že bezpečnostní profil u dospívajících je obdobný jako u dospělých. Nejsou informace o užití Copaxone u dětí...

Více