EKG-uppgift. Grupp SPTB2 8/

Relevanta dokument
TDDC74: EKG-projekt. Christoph Heilmair. Korrekturläst av: Emma Soffronow, leg. sjuksköterska. Mars 2015

SPT1 TBMT01, HT2, DECEMBER Maja Ilestrand, Johanna Karlsson, Oliver Keelan

Motivet finns att beställa i följande storlekar

EKG-klassificering. Andreas Bergkvist, Michael Sörnell,

Hemuppgift för E2 SF1635, HT 2007

Elektrokardiografi (EKG)

Projekt 1 (P1) Problembeskrivning och uppdragsspecifikation

Laboration: Grunderna i MATLAB

Projekt 6. Fourieroptik Av Eva Danielsson och Carl-Martin Sikström

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 9p av totalt 20p Hjälpmedel: MATLAB

Tentamen del 2 SF1511, , kl , Numeriska metoder och grundläggande programmering

EKG introduktion -Vänster skänkelblock

Bilaga 4, Skapa grafiskt användargränssnitt med guide

Logik och Jämförelser. Styrsatser: Villkorssatsen if och repetitonssatsen for. Scriptfiler. Kommentarer. Tillämpningar: Ett enkelt filter.

Laboration i Fourieroptik

Signalbehandling Röstigenkänning

TEM Projekt Transformmetoder

Optimal Signalbehandling Datorövning 1 och 2

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 21:a April klockan

Mätning av biopotentialer

MR-laboration: design av pulssekvenser

Övervakningssystem. -skillnader i bilder. Uppsala Universitet Signaler och System ht Lärare: Mathias Johansson

Faltningsreverb i realtidsimplementering

5B1146 med Matlab. Laborationsr. Laborationsgrupp: Sebastian Johnson Erik Lundberg, Ann-Sofi Åhn ( endst tal1-3

Numerisk lösning till den tidsberoende Schrödingerekvationen.

Tillämpning av komplext kommunikationssystem i MATLAB

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Bildbehandling i frekvensdomänen

Laboration 3 Sampling, samplingsteoremet och frekvensanalys

TANA17 Matematiska beräkningar med Matlab

Ansiktsigenkänning med MATLAB

Ett enkelt OCR-system

Magnetiska fält laboration 1FA514 Elektimagnetism I

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Hjärtkärlsjukdomar. Fysioterapeutprogramet Termin 2. Anton Gard, ST-läkare Kardiologi

FÖRSÄTTSBLAD TILL TENTAMEN. ELLER (fyll bara i om du saknar tentamenskod): Datum: 16 januari Bordsnummer:

DN1240, numo08 Stefan Knutas, Fredrik Båberg, B.10: Nalle-Maja gungar

MATLAB Laboration problem med lokala extremvärden

TSBB16 Datorövning A Samplade signaler Faltning

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Introduktion till MATLAB

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

% Föreläsning 4 22/2. clear hold off. % Vi repeterar en liten del av förra föreläsningen:

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

TANA17 Matematiska beräkningar med Matlab

Digital Signalbehandling i Audio/Video

Spektrala Transformer

Användarmöte. Arbetsprov och lungfunktion 14 nov Fall 1 Arbetsprovets användning vid utredning av preexcitation.

Projekt i programmering 1 (ver 2)... 2 Projektidé... 2 Planering... 2 Genomförande... 2 Testning och buggar... 3 Utvärdering... 3 Planering...

Nadia Soheily Magnus Engström

Uppgift 1 ( Betyg 3 uppgift )

Styr- och Reglerteknik för U3/EI2

LAB 4. ORDINÄRA DIFFERENTIALEKVATIONER. 1 Inledning. 2 Eulers metod och Runge-Kuttas metod

Bildbehandling, del 1

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Envariabelanalys 5B1147 MATLAB-laboration Derivator

DT1130 Spektrala transformer Tentamen

Flerdimensionella signaler och system

Bildförbättring i spatial domänen (kap. 3) Bildförbättring (enhancement) Spatial domän. Operatorer. Tröskling (threshold) Gråskale-transformationer

Matematisk Modellering

EKG-tolkning. EKG som vi vanligen tänker VT Frontalplan. Depolarisationens spridning... Vad ser de olika avledningarna?

Signaler och System Höstterminen -02 IT3 Rasha Alshammari Andreas Nissemark Zakai kass-saliba Pavel Carballo

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Gemensamt projekt: Matematik, Beräkningsvetenskap, Elektromagnetism. Inledning. Fysikalisk bakgrund

TSKS08 Introduktionskurs i Matlab Föreläsning 2

AD-DA-omvandlare. Mätteknik. Ville Jalkanen. 1

Laboration i tidsdiskreta system

Bildbehandling i frekvensdomänen. Erik Vidholm

Tentamen, Programmeringsteknik för BME, F och N

Styr- och Reglerteknik för U3/EI2

Resttentamen i Signaler och System Måndagen den 11.januari 2010, kl 14-19

4.4. Mera om grafiken i MATLAB

DIGITALA FILTER. Tillämpad Fysik Och Elektronik 1. Frekvensfunktioner FREKVENSSVAR FÖR ETT TIDSDISKRET SYSTEM. x(n)= Asin(Ωn)

Kundts rör - ljudhastigheten i luft

Dagens föreläsning (F15)

RemoteBud. Inlämnas: Patrik Johnsson, e01pjo Viktor Karlsson, e01vk

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Hjälpmedel: MATLAB

TSBB14 Laboration: Intro till Matlab 1D

Programmeringsuppgift Game of Life

Beräkningsverktyg HT07

Mätningar med avancerade metoder

Dagens program. Programmeringsteknik och Matlab. Administrativt. Viktiga datum. Kort introduktion till matlab. Övningsgrupp 2 (Sal Q22/E32)

Manual. Kyoritsu 2432 Läckströmstång EAN: R

Publicerat för enhet: Kardiologiklinik Version: 4. Innehållsansvarig: Maria Åkerlind, Sjuksköterska, Avdelning 43 (marko19) Giltig från:

Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson Plot och rekursion

Instruktion för laboration 1

Medicinska Bilder, TSBB31. Lab: Mätvärden på Medicinska Bilder

Bestäm uttrycken för följande spänningar/strömmar i kretsen, i termer av ( ) in a) Utspänningen vut b) Den totala strömmen i ( ) c) Strömmen () 2

Inledning. Kapitel Bakgrund. 1.2 Syfte

MMA132: Laboration 2 Matriser i MATLAB

Elektronik. Viktor Öwall, Digital ASIC Group, Dept. of Electroscience, Lund University, Sweden-

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 14:e januari klockan

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

A/D- och D/A- omvandlare

Cédric Cano Uppsala Mätsystem F4Sys. Pulsmätare med IR-sensor

MATLAB the Matrix Laboratory. Introduktion till MATLAB. Martin Nilsson. Enkel användning: Variabler i MATLAB. utvecklat av MathWorks, Inc.

Applikationsexempel rumskompensering

Transkript:

EKG-uppgift Grupp SPTB2 8/12 2015

Innehåll 1. Inledning... 3 2. Medicinsk bakgrund... 3 2.1 Arytmi... 3 2.2 ST-förändringar... 4 3. Algoritmdesign... 4 3.1 Brusfiltrering och baslinje... 4 3.2 Hitta R-toppen... 5 3.3 Hitta Q- och S-vågorna... 6 3.4 Hitta T-vågen... 6 3.5 Hitta ST-segmentet... 6 3.6 Hitta avstånd mellan R-toppar... 6 3.7 Hitta en eventuell arytmi... 7 4. Resultat... 7 4.1 EKG 1... 7 4.2 EKG 2... 8 4.3 EKG 3... 8 4.4 EKG 4... 10 4.5 EKG 5... 10 5. Diskussion... 11 6. Reflektion... 12 Böcker:... 13

1. Inledning Elektrokardiografi (EKG) är en metod som används för att undersöka hjärtats aktivitet. Genom att sätta elektroder på olika ställen på kroppen kan man mäta elektrisk aktivitet från hjärtmuskeln. Mätningen kan sedan illustreras som en signal och plottas som en funktion av tid i ett diagram som kallas EKG. Det är en viktig metod som används ofta inom diagnostik av hjärt- och kärlsjukdomar. I denna rapport presenteras och förklaras hur en EKG-algoritm har framställts för att tolka EKG samt resultatet för fem givna EKG av olika karaktär. Fokus i rapporten ligger på att ett enkelt och förståligt sätt förklara varje funktion av algoritmen. För mer detaljerad överblick av algoritmen hänvisas läsaren till appix A där algoritmens ursprungskod kan överblickas. 2. Medicinsk bakgrund I figur 1 visas morfologin för ett normalt EKG, vilket är en grundförutsättning att ha kunskap om för att hitta avvikelser i EKG-signalen. I ett EKG kan man bland annat se om personen i fråga har en arytmi eller ST-förändringar. Figur 1. Ett normalt EKGs morfologi (Agateller, 2007) 2.1 Arytmi Enligt hjärt- och lungfonden är arytmi ett tillstånd när hjärtat inte håller en jämn rytm, vilket innebär att hjärtat kan slå för fort, för långsamt eller oregelbundet. De analyserade EKG-signalerna innehåller två olika typer av arytmier; ventrikulära extraslag och arteriella extraslag. Enligt Davies utmärker sig ett ventrikulärt extraslag genom att de har en bredare QRS-komplex och ofta en negativ T-våg. Davies beskriver morfologin av ett arteriellt extraslag som morfologin av ett normalt slag med lite förändrad P-kurva.

2.2 ST-förändringar ST-segmentet är den del av EKG:t som ligger belägen mellan S-vågen och T-vågen. ST-sträckan jämförs med en baslinje som syns innan P-vågen, den kan vara antingen förhöjd eller sänkt i förhållande till baslinjen. Detta undersöks ofta vid EKG-mätning, framförallt inom hjärtinfarktdiagnostik. (Karolinska institutet, Södersjukhuset, 2012) Vid ischemi i hjärtat genererar den ischemiska delen av hjärtmuskulaturen små elektriska strömmar när kammaren egentligen är repolariserad och i vila. Om dessa strömmar rör sig mot den positiva elektroden höjs baslinjen som syns innan QRS-komplexet, då handlar det om icke-transmural ischemi. Det syns på EKG:t som att ST-segmentet verkar vara sänkt jämfört med denna baslinje, så kallad STsänkning. Om dessa strömmar istället rör sig bort från den positiva elektroden sänks baslinjen innan QRS-komplexet, då handlar det om transmural ischemi. Det syns på EKG:t som att ST-segmentet istället verkar vara höjt jämfört med denna baslinje, så kallad ST-höjning. (Klabunde, 2010) 3. Algoritmdesign Algoritmen består av ett skript som anropar mindre funktioner som behandlar EKG-signalen på olika sätt. Denna uppdelning gör det både lättare för utomståe att förstå koden då varje funktion blir koncentrerat till ett ämnesområde, samt att koden blir mer lättarbetat och lättare att felsöka. 3.1 Brusfiltrering och baslinje Först filtreras EKG-signalen med ett lågpassfilter för att minska bruset i signalen. Vid filteringen används ett butterworth-filter som filtreras med hjälp av matlabfunktionen filtfilt som filtrerar signalen framåt sedan vänder signalen och filtrerar igen. Denna funktion gör att det inte blir någon fasförskjutning. 65 hz som gräns? bakgrundsstörningar från teknisk utrustning 50-60 hz? Ibland har EKG-signaler varierande baslinje, vilket är ett mätfel som beror på en ostadig amplifierare. Detta hanterar funktionen ampnorm som normaliserar signalen till en uppskattad baslinje. Den tar som inargument en EKG-signal och signalens sampelfrekvens. Algoritmen använder matlabs funktion smooth som utjämnar signalen genom att ta medelvärde av signalen för varje sekund, alltså över ett antal sampel som är lika med sampelfrekvensen. Denna utjämnade signal subtraheras sedan från signalen så att en amplitudnormerad signal erhålls och returneras av funktionen. Figur 1 och 2 visar olika EKG före och efter amplitudnormering.

Figur 1: EKG3 före (röd) och efter (blå) amplitudnormering med funktionen ampnorm. Figur 2. EKG2 före (röd) och efter (blå) amplitudnormering med funktionen ampnorm. 3.2 Hitta R-toppen Funktionen findrpeak använder matlabfunktionen findpeaks som hittar alla toppar i en signal och returnerar deras amplituder och position. Eftersom inte alla toppar önskas, används funktionen med minimikrav på höjd på toppar samt minimikrav på avstånd till föregåe topp. Minimikravet för höjden av de topp som erhålls är medelvärdet av det maximala värdet och minimala värdet av signalen, vilket ast R-topparna överstiger. Minimikravet på avstånd till föregåe pik infördes på grund av att det ibland finns flera småtopp i en R-topp. Då dessa ligger väldigt nära varandra och approximeras som ast en pik.

3.3 Hitta Q- och S-vågorna Funktionen FindQS hittar vågorna Q och S som omger R-toppen. Detta görs genom att invertera signalen, vilket resulterar i att Q- och S-vågorna blir positiva. Matlabfunktionen findpeaks kan då, precis som i fallet för R-toppen, används för att hitta samtliga toppar. Varje position för Q- och S- vågorna sparas i en vektor som sedan jämförs mot R-topparnas position. Den första toppen till vänster om R-toppens position erhålls som Q-vågen och den första piken till höger erhålls som S-vågen. Efter filtrering utav icke relevanta toppar returnerar funktionen alla Q-vågor, dess positioner, samt alla S- vågor och dess positioner. 3.4 Hitta T-vågen Eftersom varje T-våg normalt sätt är den första förekommande topp till höger om R-toppen kan T- vågen approximeras på samma sätt som i fallet för Q- och S-vågorna. Amplituden och positionen för varje T-våg sparas ner i en vektor som jämförs mot R-toppens position. Den första toppen till höger om R-toppen erhålls som T-vågen. Skillnaden gentemot funktionen FindQS är att findt inte inverterar signalen, vilket innebär att den inbyggda Matlabfunktionen findpeaks kan användas direkt för att finna T-vågen. Precis som i funktionen findrpeak sätts ett minimikrav på höjden utav varje T-våg, samt ett minimikrav på avstånd och bredd mellan förekommande toppar. Dessa krav implementerades genom att analogt testa de olika kraven. Tyvärr tar denna funktion enbart hänsyn till positiva T-vågor, vilket skapar en del begränsningar för algoritmen i sig. 3.5 Hitta ST-segmentet Matlabfunktionen findst approximerar ST-segmentet för varje hjärtslag. Detta görs genom att utnyttja positionerna för varje S- och T-våg. Eftersom varje hjärtslag innefattar en S-våg och en T-våg kan dessa paras ihop för varje slag. Då många hjärtslag saknar utjämning av området mellan S- och T-våg (det som normal kallas ST-segmentet) approximerades ST-segmentet istället genom att ta medelavståndet mellan S- och T-vågorna. Addition av medelavståndet och positionen för S-vågorna för varje hjärtslag ger den approximerade positionen för ST-segmentet. Genom att upprepa denna procedur för hela signalen och använda Matlabfunktionen plot påvisas eventuella elevationer och depressioner i ST-segmentet. Denna funktion utnyttjas i de fall då T-vågorna är positiva. I de fall där T-vågorna är negativa till följd av dubbelslag indikerar programmet på att ett ST-skift är närvarande i signalen direkt. 3.6 Hitta avstånd mellan R-toppar Matlabfunktionen diff skapar en vektor med alla avstånd mellan de tidigare hittade R-topparna. Denna vektor behandlas i funktionen finddistancer som räknar om detta avstånd i sekunder och avgör om det finns någon arytmi bland slagen. Genom att pulsen kan ändras lite under mätningarna avläser funktionen skillnaden mellan två närliggande slag och ser om förändringen motsvara mer än 0.3 sekunder. Tröskelvärdet 0,3 är valt ifrån att en arytmi sägs komma från att ett slag skiljer sig ca 10 % från normalslaget (Davids, 2014 ). Platserna då dessa slag inträffar sparas och skickas vidare till funktionen KindOfArythmia.

3.7 Hitta en eventuell arytmi Morfologin av alla slag som klassas som arytmi undersöks av funktionen KindOfArythmia som hittar om slaget har en bred R topp eller om slaget har normal morfologi. Alla slag med extra bred R-topp är ventrikulära extraslag medan de slag som har normal morfologi är arteriella extraslag. 4. Resultat Algoritmen ger ut en tabell över resultatet för varje analyserat EKG, samt ett antal figurer som bland annat beskriver förändring utav ST-segmentet. Dessa resultat är presenterade nedan. 4.1 EKG 1 Som kan avläsas i figur 3 är EKG 1 normalt. Figur 4 visar ST-nivån och att den ast har små förändringar över tid. Figur 3: Resultattabell från EKG 1, visas normalt i command window i matlab. Figur 4: En kurva som beskriver hur ST-nivån i EKG 1 förändras.

4.2 EKG 2 Resultatet från algoritmen visas i figur 5, vilket tyder på ett normalt EKG. Figur 6 visar att det ast är små ST-förändringar och ingen ST-höjning eller -sänkning. Figur 5: Resultattabell från EKG 2, visas normalt i command window i matlab. 4.3 EKG 3 Figur 6: En kurva som beskriver hur ST-nivån i EKG 2 förändras. Figur 7 visar att det finns 6 stycken arteriella extraslag i EKG 3, men att det annars är normalt. Vilka tidpunkter som dessa slag inträffar visas i command window i vektorform. Som kan avläsas i figur 8 är ST-nivån normal.

Figur 7: Resultattabell från EKG 3, visas normalt i command window i matlab. Figur 8: En kurva som beskriver hur ST-nivån i EKG 3 förändras. Figur 9: En grafisk representation hur de arytmetiska slagen ser ut i EKG3.

4.4 EKG 4 EKG 4 har 139 ventrikulära extraslag enligt figur 9, vilket medför en ST-sänkning vid dessa slag. Algoritmens ST-nivåfunktion kan inte ta hänsyn till dessa negativa T-toppar, men att en ST-sänkning finns noteras som följd av de ventrikulära extraslagen. Figur 10 visar morfologin av de slag som är innan extraslaget och morfologin för extraslaget. Figur 9: Resultattabell från EKG 4, visas normalt i command window i matlab. Figur 10: En grafisk representation hur de arytmiska slagen ser ut i EKG4. 4.5 EKG 5 En klippt version av EKG 5 ger resultatet presenterat i figur 11. Signalen är klippt då mycket störningar finns i signalen som förmodligen orsakats av lösa elektroder eller andra mätfel. Som kan ses i figur 12 har EKG 5 en tydlig ST-höjning efter ca 200 sekunder av inspelningen.

Figur 11: Resultattabell från EKG 5, visas normalt i command window i matlab. Figur 12: En kurva som beskriver hur ST-nivån i EKG5 förändras. 5. Diskussion Ett alternativ till ampnorm är att högpassfiltrera, vilket testades men valdes bort på grund av känsligheten att förstöra originalsignalen. Första lågpassfiltreringen har också en alternativ lösning som kallas medelvärdesbildning. Medelvärdesbildningen gjordes med en funktion kallad ensamble som lägger ihop hjärtslagen och ger en fin bild av morfologin. Eftersom inget användningsområde för medelvärdesbildningen hittades då vanlig lågpassfiltrering räckte för att ge ett läsligt resultat, togs den inte med. Algoritmen är designad att hitta de två specifika arytmierna som beskrivits och skulle någon annan liknande arytmi vara närvarande skulle den kunna kännas igen som någon av de två arytmierna som algoritmen är designad för. Känsligheten för funktionen är alltså inte hög, vilket kan ge felaktiga svar för andra EKG-signaler än de som testats. Ett annat stort problem var EKG 5 som bestod utav en förhållandevis svårtolkad signal. Detta gjorde det svårt att analysera och implementera algoritmen för EKG 5. Detta åtgärdades genom att utesluta de delar som ansågs ha sitt ursprung i mätfel eller andra faktorer så som lösa elektroder som påverkade signalen negativt. Givetvis finns det en viss risk att man råkar utesluta för stora delar ur signalen där viktig information skulle funnits att hämta.

En förbättring av algoritmen som hade kunnat göras är att göra den mer flexibel för abnormaliteter i signalen exempelvis genom att utgå ifrån derivator och andraderivator av signalen istället för att använda funktionen findpeaks. Lösningarna skulle dessutom inte fungera lika bra i realtid, då de är anpassade för att kunna hantera hela signaler. 6. Reflektion Resultatet av arbetet anses av gruppen ha varit bra. Dock finns det områden som kunde ha förbättrats. Det som orsakade det största problemet var en negativ T-våg i EKG 4 som till följd sätter vissa begränsningar på algoritmen. Detta hade förmodligen kunnat åtgärdas om den allokerade tiden i kursen för grupparbetet hade utökats.

Referenser Elektroniska källor: Hjärtflimmer och andra hjärtrytmrubbningar. Hjärt- och Lungfonden. 2015. https://www.hjartlungfonden.se/sjukdomar/hjartsjukdomar/hjartrytmrubbningar/?gclid=cmij46wgvckcfcn7cgodxi AA2A# (hämtad 2015-12-02) Prehospital EKG-tolkning. Karolinska institutet, Södersjukhuset. 2012. http://deto2x.se/wp-content/uploads/2012/10/ekg-tolkning.pdf (hämtad 2015-12-06) Klabunde, Richard E. 2010. Electrophysiological Changes During Cardiac Ischemia. Cardiovascular Physiology Concepts. http://www.cvphysiology.com/cad/cad012.htm (hämtad 2015-12-06) Böcker: Davids, Alan. 2014. Starting to read ECG- A comprehensive guide to Theory and Practice, Springer Bildkällor: (Agateller) Atkielski, Anthony. De olika vågorna på en normal EKG-kurva.Wikipedia. https://sv.wikipedia.org/wiki/elektrokardiografi#/media/file:sinusrhythmlabels.svg (hämtad 2015-12-02)

Appix I: ReadECG function [Resultat] = ReadECG(EKG, fs) load ECG.mat EKG_length_seconds = length(ekg)/fs; axel=(1:length(ekg)); antal_samp_tot = length(ekg); tids_axel = linspace(0,ekg_length_seconds,antal_samp_tot); figure(1) plot(tids_axel, EKG) title('starting EKG-signal') %% En alternativ lösnng till Lågpass + baslinje förflyttning (alt 1) % Filtrerar signalen för att få den på en baslinje och för att få bort % högfrekvent brus. De försök som gjordes förändrade vissa delar av EKG4 % och EKG5, vilket gjorde att vi uteslöt denna metod. % EKG_rak = alternative_hi_lo_filtering(ekg,fs,1.3,65); %% Filtrerar signalen med ett butter filter (alt 2) % firstfiltering lågpassfiltrerar signalen. % ampnorm får hela kurvan på en baslinje % genom att ta ut kurvans variation med hjälp av % smoothing för att sedan dra bort den från den filtrerade signalen. EKG_filt = firstfiltering(ekg, fs, 65); EKG_rak = ampnorm(ekg_filt, fs); %% EKG5- klippa bort delar av signalen % Gäller bara EKG5 och de delar där en elektrod lossnat/sitter löst och % förstör signalen. % Tar bort sek 480-560 sek if (length(ekg) == length(ekg5)) EKG_rak((480*fs):(580*fs)) = []; EKG_rak((120200):(120200+249)) = []; % Sätter om axlar till nya längden axel=(1:length(ekg_rak)); EKG_length_seconds = length(ekg_rak)/fs; antal_samp_tot = antal_samp_tot-(580*fs-480*fs)-251; tids_axel = linspace(0,ekg_length_seconds,antal_samp_tot); figure(8) plot(ekg_rak) title('borttaget ur siganl') EKG_smooth = EKG_rak; %% Hitta R-toppen % EKG högpassfiltreras och findpeaks hittar R-topparna.

[amplitude_r, location_r, antal_r_toppar] =... findrpeaks(ekg_smooth, axel, 20, fs); Puls = (antal_r_toppar/ekg_length_seconds)*60; %% Hitta S och Q % ECG inverteras och findpeaks hittar Q och S topparna. Utgår från R- % toppens position. S_dalar=[]; S_dallocation=[]; Q_dalar=[]; Q_dallocation=[]; [S_dalar, S_dallocation, Q_dalar, Q_dallocation] =... findqsvalleys(ekg_smooth, location_r, axel); %% Hitta Skillnaden mellan R toppar & typ av arytmi % FindDistanceR skapar en vektor med skillnaden i sampel mellan alla % R-toppar och om dessa motsvarar en ändring på 0.3 sekunder klassas slaget % som ett arytmetiskt slag. Om det sker anropas funktionen KindOfArythmia % vilket avgör vilken typ av arytmi genom att titta på morfologin av % slaget. [platser_arytmi, procent_arytmi] = finddistancer(location_r, fs); procent_arytmi; Antal_ventrik = 0; Antal_art = 0; if (procent_arytmi > 0) [Antal_ventrik, Antal_art,tid_ventr,tid_art] = KindOfArythmia(antal_R_toppar,platser_arytmi, EKG_smooth, location_r,fs,tids_axel); figure(200) plot(tids_axel,ekg_rak) title('time instances where arythmicbeats occure') hold on; plot(tid_ventr) hold off; Antal_art %% Hitta T-toppen % Hittar T-toppen utgåe från R-toppen. T_dallocation = []; T_dalar = []; [T_dallocation, T_dalar] = findt(ekg_smooth, location_r, axel,fs); %% S-T sänkning/höjning % Skapar en funktion som hittar ST-nivån, genom att hitta det sampel som % ligger mellan S och T. DifVect = [];

ST_h = 'nej'; [DifVect,tid_ST, ST_h] = findst( location_r, T_dallocation, S_dallocation,... EKG_smooth, fs); figure(20) subplot(2,1,1) plot(tids_axel,ekg_rak) title('ecg over time') subplot(2,1,2) plot(tid_st,difvect) title('st amplitude change over time') %% Medelvärdesbildning % Tittade på om en medelvärdesfunktin skulle underlätta undersökningarna av % morfologin, men vi beslutade att inte använda denna funktion. % [ensemble] = ensemble_ecg(antal_r_toppar,platser_arytmi, EKG_smooth, location_r,fs); %% Resultat ST_s = 'Nej'; if(antal_ventrik > 0) ST_s = 'Ja'; variabler = {'Puls' Puls; 'Antal ventrikulära arytmetiska slag' Antal_ventrik;'Antal arteriella arytmetiska slag' Antal_art;'ST-sänkning' ST_s;'ST-höjning' ST_h}; Resultat = cell2table(variabler, 'VariableNames',{'EKG3' 'Resultat'}); Appix II: ampnorm function EKG_rak = ampnorm( EKG_filt, fs ) %AMPNORM Normaliserar EKG signalen genom att estimera en baselinje med % smoothing. Smoothes filtererade EKG med faktor fs och subtraherar resulterade signalen % från filtrerade EKG signalen, vilket resulterar i en % amplitud-normaliserad EKG signal. EKG_length_seconds = length(ekg_filt)/fs; antal_samp_tot = length(ekg_filt); tids_axel = linspace(0,ekg_length_seconds,antal_samp_tot); EKG_smoothmax = smooth(ekg_filt,fs); EKG_rak = EKG_filt-EKG_smoothmax; figure(2)

plot(tids_axel,ekg_rak) hold on; plot(tids_axel,ekg_filt) hold off; title('the signal before and after the movement of the baseline') Appix III: firstfiltering function [ EKG_filt ] = firstfiltering( EKG, fs, filteredfreq ) %Filtrerar EkG signalen en första gång för att ta bort %frekvenskomponenter som är över tröskelgränsekn filteredfreq Hz EKG_length_seconds = length(ekg)/fs; antal_samp_tot = length(ekg); tids_axel = linspace(0,ekg_length_seconds,antal_samp_tot); [b, a] = butter(4,filteredfreq/(fs/2)); EKG_filt = filtfilt(b, a, EKG); figure(22) plot(tids_axel, EKG_filt) hold on; plot(tids_axel, EKG) hold off; title('the signal before and after the lowpassfilter') Appix IV: findrpeak function [ amplitude_r, location_r, antal_r_toppar ] = findrpeak( EKG_smooth, axel, peakdist, fs ) % I funktionen findrpeaks filtreras signalen först för att göra det %lättare att hitta R-topparna. Alla R-toppar i ECG-signalen som %ligger ovanför medelamplituden sparas i en vektor med R-toppens %amplitud och position. [b, a] = butter(4, 3/(fs/2),'high'); EKG_filt = filtfilt(b, a, EKG_smooth); % figure(5) % plot(ekg_smooth) % title('skillnad i signalen efter högpassfiltrering för R-topp') % hold on; % plot(ekg_filt) % hold off; hog = max(ekg_smooth); lag = min(ekg_smooth); med = (hog+lag)/2;

[amplitude_r, location_r] = findpeaks(ekg_filt,axel,'minpeakheight',med,'minpeakdistance', peakdist); antal_r_toppar = length(amplitude_r); Appix V: findqs function [ S_dalar, S_dallocation, Q_dalar, Q_dallocation ]... = findqs( EKG_smooth, location_r, axel ) %FINDQS hittar amplituden och platsen för Q och S vågor. % Den använder platsen för R topparna. Först inverterar den EKG signalen % och hittar dalarna (som nu är toppar) med findpeaks funktionen. EKG_smoothInverse = -1*EKG_smooth; [Minima, Minlocs] = findpeaks(ekg_smoothinverse,axel,'minpeakdistance',10); k=1; f=1; for i = 1:length(location_R) while (Minlocs(f) < location_r(i)) if(minlocs(f+1)>location_r(i)) S_dallocation(i) = Minlocs(f+1); S_dalar(i) = Minima(f+1); Q_dallocation(i)=Minlocs(f); Q_dalar(i)=Minima(f); f=f+1; Appix VI: finddistancer function [ platser_arytmi, procent_arytmi ] = finddistancer( location_r, fs ) % Funktionen hittar långa avstånd mellan två R-toppar. % Först skapas en vektor med alla avstånd och avstånden räknas om i % skeunder ist för sampel. Vektorn med avstånden i skunder loopas igenom % och om två slag skiljer sig från varandra med o.3 skunder eller mer lagras de i en arytmi % vektor. diff_r_toppar = diff(location_r); hi = max(diff_r_toppar); diff_r_toppar_sek = diff_r_toppar./fs ; hi_sek = max(diff_r_toppar_sek); mean(diff_r_toppar_sek); platser_arytmi=zeros(1, length(location_r)); % figure(7)

% plot(diff_r_toppar_sek) arytmi_slag = 0; for f = 2:length(diff_R_toppar_sek)-1 if(diff_r_toppar_sek(f)-diff_r_toppar_sek(f-1) > 0.30) arytmi_slag = arytmi_slag +1; platser_arytmi(f-1)=1; platser_arytmi(f)=1; f=f+1; procent_arytmi = (arytmi_slag/length(location_r))*100; disp('antal arytmi slag:') disp(arytmi_slag) Appix VII: KindOfArythmia function [ Antal_ventrik, Antal_art,tid_ventr,tid_art] = KindOfArythmia(antal_R_toppar,platser_arytmi, EKG_smooth, location_r,fs, tids_axel) %Hittar arytmierna i EKG % Letar efter extra tjocka peakar, vilket tyder på ventrikulära arytmi % slag. Om inte ett ventrikulärt extra slg är det ett arteriellt slag. Vi % delar totala antalet på 2 då vi har lagt in alla arytmislag med dess % normala närmsta slag. Vilken_arytmi = zeros(1, fs+1); counter = 0; ampli_medel = max(ekg_smooth)/2; Antal_ventrik = 0; f=1; m=1; tid_ventr = []; tid_art = []; for i=2:(antal_r_toppar-1) if (platser_arytmi(i)~=0) Slag = EKG_smooth((location_R(i)-fs/2):(location_R(i)+fs/2)); [pks, locs] = findpeaks(slag,'minpeakheight',ampli_medel, 'MinPeakWidth',12); figure(15) plot(slag) title('all arythmic beats + all normal beats just before') hold on; if(length(pks)>0) Antal_ventrik = Antal_ventrik + 1; tid_ventr(f) = location_r(i)/fs; f = f+1; else tid_art(m) = location_r(i)/fs; m=m+1;

counter = counter + 1; hold off; Antal_art = ceil(counter/2)-antal_ventrik; disp('antal arytmiska slag:') disp(ceil(counter/2)) disp('antal ventrikulära arytmiska slag:') disp(antal_ventrik) disp('antal arteriella arytmiska slag:' ) disp(antal_art) if(antal_art > 0) disp('slagen uppkommer sekunder:') disp(tid_art) else disp('slagen uppkommer sekunder:') disp(tid_ventr) disp('arytmin medför en ST-sänkning') Appix VIII: findt function [ T_dallocation, T_dalar ] = findt(ekg_smooth, location_r, axel,fs) %fintt börjar med att sätta krav på toppar som måste uppfyllas för att det %ska kunna vara en T-top. Dessa sparas ner i en vektor. Denna vektor loppas %igenom och hittar den första toppen närmast R-toppen, vilket då sätts som %T-toppen för varje hjärtlsag. maxhojd = max(ekg_smooth); [Maxima, Maxlocs] = findpeaks(ekg_smooth,axel,'minpeakdistance',20,... 'MinPeakHeight',maxhojd/30,'MinPeakWidth',10); findpeaks(ekg_smooth,axel,'minpeakdistance',20,... 'MinPeakHeight',maxhojd/30,'MinPeakWidth',10) T_dallocation = []; T_dalar = []; f=1; a=length(maxlocs); for i = 1:length(location_R) while ((a >= f+1) && (Maxlocs(f) <= location_r(i))) if(maxlocs(f+1) > location_r(i)) T_dallocation(i) = Maxlocs(f+1); T_dalar(i) = Maxima(f+1); f=f+1; f=1;

Appix IX: findst function [ DifVect,tid_ST, ST_h ] = findst( location_r, T_dallocation, S_dallocation,... EKG_smooth, fs) %findst loopar igenom signalen och den totala längden av alla R-toppars %position. Minus ett är ett nödvändigt krav vilket förhindrar loppen från %att loppa igenom positioner som inte finns. Genom att ta varje T-position %och S-position för varje hjärtlsag får man ett medelsträckan mellan S- och %T-vågen. Genom att addera medelsträckan till S-vågens position kan en %approximerad ST-segment. Detta sparas ner i en vektor. tid_st = []; for i = 1 : length(location_r)-1 tempdif = (T_dallocation(i) - S_dallocation(i))/2; tempx = S_dallocation(i)+tempDif; tempy = EKG_smooth(ceil(tempX)); DifVect(i) = tempy; tid_st(i) = tempx/fs; % Endast för att skriva ut resultatet snyggt i tabellform Max_ST = max(difvect); Min_ST = min(difvect); Medel = mean(difvect); ST_h = 'Nej'; if (Medel > 20) ST_h='Ja';