Z-ANO - České vysoké učení technické v Praze
Transkript
Č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é
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...
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.
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...
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...
Toto
pcolor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
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í...