====== Zobrazení a zpracování EKG signálu ====== ===== Zadání ===== Vytvořte kód pro načtení, zpracování a zobrazení signálu EKG. ---- Následující části úlohy jsou **povinné!** Jednotlivé úkoly pro část úlohy tvořenou na cvičení jsou: - Načtení signálu EKG a impulsové odezvy filtru //(0.2 bodu)// * Signál EKG společně s dalšími informacemi o signálu je v souboru [[http://bio.felk.cvut.cz/~huptycm/Vyuka/eHealth_Telemedicina/Data/ekg.csv|ekg.csv]]. * Soubor kromě signálu ((třetí řádek souboru)) obsahuje také název svodu EKG ((první řádek souboru)) a informaci o vzorkovací frekvenci a senzitivitě signálu ((druhý řádek souboru)). * Impulsová odezva filtru je umístěna v souboru [[http://bio.felk.cvut.cz/~huptycm/Vyuka/eHealth_Telemedicina/Data/impulsova_odezva.txt|impulsova_odezva.txt]]. * Jednotlivé části souborů nahrajte do vhodných datových struktur vhodných datových typů ((samotné proměnné či pole datových typů double, int, String, atd.)). - Filtrace signálu (konvoluce signálů EKG a impulsové odezvy) //(0.3 bodu)// * Kód pro konvoluci je dostupný v souboru [[http://bio.felk.cvut.cz/~huptycm/Vyuka/eHealth_Telemedicina/src/Convolution.java|Convolution.java]]. Tento kód můžete přímo použít. * Pro správnou délku výsledného signálu je potřeba vhodným způsobem upravit výstup konvoluce. - Vykreslení signálů EKG //(0.5 bodu)// * Vykreslení EKG signálů bude v jednom obsahovat jak nevyfiltrovaný tak vyfiltrovaný signál (signály budou odlišeny minimálně barvou). * U vykreslení bude možné změnit koeficient horizontálního i vertikálního měřítka (pomocí nastavení jedné hodnoty pro každou škálu). * Vykreslení by mělo mít ošetřeno podvzorkování signálu. * Pokud bude Vaše vykreslení založeno pouze na vynechání hodnot, lze jej hodnotit maximálně //0.2 body//! - Detekce a vykreslení vrcholů R kmitů //(0.5 bodu)// * Pro detekci vrcholů R kmitů doporučuji použít prahování a detekci špiček (viz. poznámky k implemetaci) * Jako hodnotu prahu doporučuji volit hodnoty > 1 mV ((Pozor! Před použitím v implementaci musí být tato hodnota upravena podle senzitivity.)) * Vykreslení proveďte jednoduše, např. vykreslením vertikálních úseček u detekovaných bodů (viz. Obrázek 1). - Vytvoření a vykreslení tachogramu (záznamu průběhu srdečního rytmu v čase) z detekovaných vrcholů R kmitů //(0.5 bodu)// * Tachogram vytvořte jako samostatný signál z hodnot poloh vrcholů R kmitů (viz. Obrázek 2). * Hodnoty tachogramu budou ve vteřinách. * Nezapomeňte, že tachogram musí mít jako hodnoty časové osy detekované polohy vrcholů R kmitů. ---- Následující části úlohy jsou **povinné!** Jednotlivé úkoly pro domácí část úlohy jsou: - Vytvoření časové osy v závislosti na vzorkovací frekvenci a zvoleném koeficientu měřítka časové osy. Tzn. časová osa bude ve vteřinách a počet vzorků na vteřinu bude odpovídat vzorkovací frekvenci a zvolené škále (škála = 1 je co vzorek to pixel) //(0.5 bodu)// - pro signál EKG //(0.25 bodu)// - pro vytvořený tachogram //(0.25 bodu)// - Vytvoření hodnotové osy v závislosti na sezitivitě a zvoleném koeficientu měřítka hodnotové osy. Tzn. hodnotová osa bude v mV a hodnota v pixelech bude odpovídat hodnotě ze souboru upravené podle senzitivity a zvolené škále (škála = 1 odpovídá stavu, kdy počet pixelů je přímo dán hodnotou signálu načtenou ze souboru) //(0.5 bodu)// - pro signál EKG //(0.25 bodu)// - pro vytvořený tachogram //(0.25 bodu)// ---- Následující části úlohy jsou **nepovinné!** Jednotlivé úkoly bonusové části úlohy: - Úpravu měřítka os tak, aby odpovídaly zvyklostem v oblasti EKG signálu ((tj. pro horizontální osu 10, 25 a 50 mm/sec; pro vertikální osu 5 mm/mV, 10 mm/mV a 20 mm/mV)). //(0.2 bodu)// - Přidání vykreslení souřadnicové mřížky k osám grafů. //(0.2 bodu)// - Vytvoření ovládacího prvku pro měřítko časové osy, tak aby odpovídaly zvyklostem v oblasti EKG signálu. //(0.3 bodu)// - pro signál EKG //(0.15 bodu)// - pro vytvořený tachogram //(0.15 bodu)// - Vytvoření ovládacího prvku pro měřítko hodnotové osy, tak aby odpovídaly zvyklostem v oblasti EKG signálu. //(0.3 bodu)// - pro signál EKG //(0.15 bodu)// - pro vytvořený tachogram //(0.15 bodu)// ===== Poznámky k implementaci ===== Poznámky k úkolům z části úlohy tvořené na cvičení: add 1.: * Pro načítání dat z ascii souborů doporučuji použít metody [[http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html|BufferedReader]] a [[http://docs.oracle.com/javase/6/docs/api/java/io/FileReader.html|FileReader]] (či jejich obdobu). * Využijte možnosti vyšších programovacích jazyků, které obsahují např. také funkce pro práci s třídou [[http://docs.oracle.com/javase/6/docs/api/java/lang/String.html|String]]. * Nezapomeňte načtená data přetypovat na vhodný datový typ. add 2.: * Při číslicové filtraci dochází k určitému zpoždění signálu. Avšak když si uvědomíte jaký výsledek má konvoluce, dokážete toto zpoždění odstranit. add 3.: * Pro vykreslení v java je vhodné použít možnosti třídy Graphics2D (https://msdn.microsoft.com/cs-cz/library/system.windows.forms.datavisualization.charting.chart%28v=vs.110%29.aspx) * Pro vykreslení v C# pak třídy Chart (https://msdn.microsoft.com/cs-cz/library/system.windows.forms.datavisualization.charting.chart%28v=vs.110%29.aspx) * Pro vykreslení můžete využít informace na těchto odkazech: [[http://docs.oracle.com/javase/tutorial/2d/]], [[http://zetcode.com/gfx/java2d/]], [[http://shulgadim.blogspot.cz/2012/07/real-time-signal-drawing.html]] * Pokud použijete pokročilejší grafické možnosti, lze škalu definovat pomocí afinní transformace (viz předchozí odkazy nebo případně [[http://msdn.microsoft.com/en-us/library/zhc2xxtx(v=vs.110).aspx|Graphics.ScaleTransform Method]]) * Podvzorokování signálu je nutné ošetřit tzv. antialiasingovým fitrem. Více lze najít zde [[http://www.prednasky.com/fit/data/ISS-2008-11-05/slides/documents/08-vzork.pdf|Jan Černocký - Vzorkování]]. Příklad použití lze najít zde [[http://developmentality.wordpress.com/2010/02/09/quick-hit-antialiasing-in-java-graphics2d/|Quick hit – antialiasing in Java Graphics2D]] a zde [[http://msdn.microsoft.com/cs-cz/library/system.drawing.graphics.smoothingmode(v=vs.110).aspx|Graphics.SmoothingMode – vlastnost]]. add 4.: * Detekce vrcholů R kmitů je prosté procházení pole hodnot signálu a hledání indexů na nichž hodnoty odpovídají: * jednak podmínce prahování * jednak detekci vrcholu, která představuje implementaci podmínky x(i-1) < x(i) > x(i+1) add 5.: * Tachogram je tvořen vzdálenostmi jednotlivých R vln (tedy RR intervaly). * Při vytvoření tachogramu nejprve zjistíte rozdíly mezi jednotlivými detekovanými indexy a následně tyto rozdíly musíte převést na čas. {{courses:17bieht:ecg_example.png?1000|Obrázek 1: Příklad zobrazení signálů EKG a detekovaných vrcholů R kmitů}} //Obrázek 1: Příklad zobrazení signálů EKG a detekovaných vrcholů R kmitů// {{courses:17bieht:tachogram_example.png?1000|Obrázek 2: Příklad zobrazení průběhu srdečního rytmu}} //Obrázek 2: Příklad zobrazení průběhu srdečního rytmu// ===== Hodnocení ===== * **Povinné:** Na cvičení je hodnocení maximálně 2 body. * **Povinné:** Domácí úloha je hodnocena maximálně 1 bodem. * **Nepovinné:** Bonus (domácí úloha) je hodnocena maximálně 1 bodem. **Důležité:** Před odevzdáním si ověřte, zda práce splňuje jednotlivé body zadání **PŘESNĚ**. Pokud si nejste jisti, co některá část zadání znamená, včas se ptejte. Při nedodržení specifikace neočekávejte ''body z milosti''. Za část úlohy ze cvičení můžete získat až 2 body. Pokud nestihnete odevzdat na cvičení, musíte ji dopracovat doma (bez bodového ohodnocení). Do dalšího cvičení máte možnost vypracovat domácí úlohu (a bonus), za jejíž splnění můžete získat další body. Odevzdává se prostřednictvím UploadSystemu, kontrola proběhne na dalším cvičení.