AKADEMIA GÓRNICZO-HUTNICZA im. St. Staszica w Krakowie WEAIiE, Katedra Automatyki Laboratorium Biocybernetyki Przedmiot: Przetwarzanie sygnałów w systemach diagnostyki medycznej. Temat projektu: Określenie osi elektrycznej załamków, wyznaczenie sygnału oddechu z zapisu EKG. Spis treści: ABSTRAKT... 2 WSTĘP... 2 KONCEPCJA PROPONOWANEGO ROZWIĄZANIA... 5 REZULTATY I WNIOSKI... 5 PODSUMOWANIE... 7 BIBLIOGRAFIA:... 7 DODATEK A: OPIS OPRACOWANYCH NARZĘDZI I METODY POSTĘPOWANIA... 7 DODATEK B: REALIZACJA PROPONOWANEGO ROZWIĄZANIA... 8 DODATEK C. OPIS INFORMATYCZNY PROCEDUR... 9 DODATEK D. SPIS ZAWARTOŚCI DOŁĄCZONYCH NOŚNIKÓW (DYSKIETEK, CD ROMU)... 11 Wykonali: Wojciech Zając, Piotr Szopa V rok IS konsultant: Dr hab. Inż. Piotr Augustyniak prof. nadzw. Wersja 1.0. Kraków, styczeo 2011. -1-
Abstrakt Celem projektu jest implementacja i przetestowanie algorytmu detekcji osi elektrycznej załamków oraz metody wyznaczenia sygnału oddechu z zapisu elektrokardiografu. W pracy przedstawiono podstawy fizjologii serca, wyjaśnienie zapisu EKG, metody wyznaczania osi elektrycznej serca oraz metody wyznaczania sygnału oddechowego na podstawie zapisu EKG Słowa kluczowe: oś elektryczna serca, zapis EKG, sygnał oddechu, odprowadzenia izoelektryczne Wstęp 1.1. Elektrokardiografia Elektrokardiografia to zapis diagnostyczny polegający na rejestracji elektrycznej czynności serca na powierzchni klatki piersiowej w postaci napięcia (różnicy potencjałów) między odpowiednimi dwoma elektrodami. Graficznie zapis EKG odczytujemy w formie krzywej elektrokardiograficznej na papierze milimetrowym lub na ekranie komputera. Podstawowym celem elektrokardiografii jest diagnostyka pracy serca na podstawie zaobserwowanych zjawisk elektrycznych. Zdolnośd komórek mięśniowych serca do spontanicznego przekazywania impulsów powoduje, że w skurczu biorą udział wszystkie zdolne do tego komórki. Ta synchronizacja powoduje, że poszczególne fazy skurczu serca są dużo wyraźniej reprezentowane przez zjawiska elektryczne niż ma to miejsce w jakimkolwiek innym przypadku sygnałów elektrodiagnostycznych. Rys. 1: Przykładowy elektrokardiogram *źródło: wikipedia+ Z diagnostycznego punktu widzenia, najistotniejsze są: -2-
Parametry czasowe, odzwierciedlające następujące po sobie zjawiska związane z pobudzeniem i relaksacją mięśnia sercowego Parametry morfologiczne, odpowiadające za miejsce powstanie impulsu pobudzającego i drogę jego przewodzenia Amplituda zarejestrowanego sygnału jest najmniej istotna gdyż na jej wartośd ma wpływ wiele pozasercowych czynników. Rozwój techniki i metod analizy cyfrowego sygnału doprowadziły do wyodrębnienia czterech głównych gałęzi elektrokardiografii: 12-odprowadzeniowe badanie EKG EKG wysiłkowe Stała 24-godzinna rejestracje metodą Holtera Wektokardiografia i elektrokardiografia wysokiej rozdzielczości 1.2. Budowa zapisu EKG Elektrokardiogram można podzielid na załamki, odcinki, odstępy. Załamkiem to odchylenie od linii izoelektrycznej. Zapis elektrokardiograficzny dzielimy na odcinki (np. odcinek QT). Przedziały czasowe pomiędzy poszczególnymi zdarzeniami w cyklu pracy serca to odstępy. Rys. 2: Schemat cyklu pracy serca Załamek P to wyniki depolaryzacji oraz skurczu przedsionka. Tak zwany zespół QRS odpowiada depolaryzacji mięśnia komór. Narastającą fala T odpowiada repolaryzacji komór. Czasami pojawia się załamek U (repolaryzacja przegrody). Pełne przejście przez te załamki oznacza cykl pracy serca. Liczba cykli na minutę stanowi tętno serca. -3-
Kształt krzywej EKG jest związany z budowa ciała, kształtem klatki piersiowej, rasą, płcią, zaburzeniami metabolicznymi, chorobami, spożytymi lekami, alkoholem itp. 1.3. Oś elektryczna serca Oś elektryczna serca jest prostą umiejscowiona w przestrzeni. Na prostej znajduje się wektor pola elektrycznego wytwarzanego przez depolaryzacje komór serca, w chwili osiągnięcia ich wartości maksymalnej. Określanie osi elektrycznej serca służy do umiejscowienia serca wewnątrz jamy ciała oraz określenia stosunku masy mięśniowej pomiędzy komora lewa i prawa. Określenie położenia osi elektrycznej jest istotne dla oceny poprawności badania EKG. Dzięki niej można wskazad np. czy przyczyna zmiany ukształtowania załamków jest odmienne ułożenie serca. Kąt pomiędzy wektorem wypadkowym a odprowadzeniem I należy do jednego z 4 przedziałów oznaczających kierunek osi elektrycznej serca: 0 o : 90 o normogram 90 o : 180 o prawogram Przerost prawej komory Blok tylnej wiązki lewej odnogi pęczka Hisa Wrodzone przesunięcie serca na prawą stronę klatki piersiowej 0 o : (-90 o ) lewogram Wartośd normalna, spotykana u osób o wysokim ustawieniu przepony, będących w ciąży lub otyłych (-90 o ) : (-180 o ) lewogram patologiczny Przerost lewej komory Blok przedniej wiązki lewej odnogi pęczka Hisa Ekotopowe pobudzenie i rytmy komorowe Oś elektryczną można określid badając cztery możliwe przypadki wychylenia zespołów QRS w odprowadzeniach I i avf (przedziały patologiczne można określid badając znak odprowadzenia II): +I, +avf normogram -I, +avf prawogram +I, -avf lewogram -I, -avf oś nieokreślona -4-
Koncepcja proponowanego rozwiązania Metoda określenia osi elektrycznej serca jest znana w Medycynie i polega na analizie odczytów z odprowadzeo kooczynowych w płaszczyźnie czołowej a dokładniej na badaniu orientacji zespołów QRS w tych odprowadzeniach. 1.4. Koncepcja wyznaczenia osi elektrycznej serca (na podstawie [3]): Wybór dwóch odprowadzeo kooczynowych o największej amplitudzie lub najmniejszym wpływie szumów. Obliczanie funkcji pierwiastka sumy kwadratów zespołów QRS obydwu odprowadzeo. Dopasowanie paraboli do otrzymanej funkcji. Wyznaczenie wartości maksimum paraboli dla poszczególnych odprowadzeo. Wyznaczenie wektora wypadkowego trzech odprowadzeo, z którego wynika kierunek osi elektrycznej serca. 1.5. Koncepcja wyznaczenia sygnału oddechu: Zmiana kierunku osi elektrycznej serca pozwala wyznaczyd sygnał oddechowy, w wyniku zmiany kształtu klatki piersiowej podczas wdechu/wydechu. Sygnał ten możemy obliczyd badając zmiany kąta który tworzy wektor wypadkowy zaczepiony w środku układu współrzędnych z tym układem. Wyznaczenie osi elektrycznej serca. Wyznaczenie x=arctg(y) gdzie y to tangens kąta tworzonego przez wektor (otrzymujemy zakłócony sygnał oddechowy). Wyznaczenie sygnału oddechu na podstawie wyników. Filtracja sygnału oddechu. 1.6. Alternatywna koncepcja wyznaczenia sygnału oddechu: Metoda wyznaczenia sygnału oddechu została opisana w artykule [1]. Pozwala ona na uzyskanie sygnału oddechu z pojedynczego odprowadzenia. Metoda rozpoczyna się od usunięcia zniekształcenia linii izoelektrycznej (baseline drift), która mogą wynikad m. in. z wahao temperatury. Można tego dokonad między innymi korzystając z transformaty falkowej oraz interpolacji co zostało opisane w dokumencie *2+. Zakładając iż znane nam jest umiejscowienie załamków R możemy przejśd do następnego kroku, którym jest obliczenie kurtozy z obszarów pomiędzy tymi załamkami. Uzyskane wartości są następnie interpolowane i ewentualnie filtrowane w efekcie czego otrzymujemy funkcję sygnału oddechu. Rezultaty i wnioski Program testowany był na zmodyfikowanych danych ze strony physionet.org z ręcznie wskazanymi załamkami QRS. Analizuje on 3 pierwsze odprowadzenia w standardowym 12-to odprowadzeniowym EKG. Częstotliwośd próbkowania dla danych wynosi 360 próbek/sekundę w zakresie 10mV. Dane wejściowe dla uproszczenia dalszych obliczeo i wizualizacji są skalowane i rzutowane na zbiór liczb całkowitych. -5-
Wygenerowana przez program wizualizacja danych wejściowych: Pierwsze trzy odprowadzenia dla 1500 próbek i zaznaczone liniami pionowymi przedziały QRS. Program poprawnie wykrywa oś serca i zwraca oraz wyświetla w innym oknie leżący na niej wektor wypadkowy. Wartośd współrzędnych wektora jest podana w liczbach całkowitych, lecz jej bezwzględna wielkośd nie ma znaczenia gdyż liczy się zależnośd pomiędzy obiema współrzędnymi dzięki, której można określid nachylenie osi serca. Współrzędne wektora są interpretowane jak w standardowym układzie współrzędnych kartezjaoskich: x rośnie im dalej na prawo od środka układu, y rośnie im wyżej od środka układu. Wygenerowana przez program wizualizacja osi serca: Wyświetlony jest wektor wypadkowy dla każdego zespołu QRS dla 1500 próbek i 5 zespołów. Zwrócone wartości: Wektor wypadkowy[x,y]: [360][-1506] Wektor wypadkowy[x,y]: [604][-1809] Wektor wypadkowy[x,y]: [529][-1939] Wektor wypadkowy[x,y]: [454][-1809] Wektor wypadkowy[x,y]: [488][-1592] Sygnał oddechu wyznaczony jest w oparciu o zmianę wyznaczonego przez wektor wypadkowy, kąta nachylenia osi serca (przyjmujemy że kąt 0 o oznacza wektor wskazujący wprost na prawo na wcześniej załączonym obrazie czyli o wartościach x>0, y=0) a także nieznacznie w oparciu o długośd wektora. -6-
Wygenerowana przez program wizualizacja sygnału oddechu dla 2000 próbek ok.5.5s. Sygnał oddechu jest generowany na podstawie odczytów z obszarów zespołów QRS, stąd jego względnie niska rozdzielczośd. Podsumowanie Praca jest implementacją metod opisanych w poprzednich częściach. Nie wykonano testów dla zbiorów danych przy użyciu innego oprogramowania tego typu ale wyniki zgadzają się z wnioskami wynikającymi z obserwacji sygnału. Głównym problemem w tworzeniu programu była koniecznośd porzucenia operacji na liczbach zmiennoprzecinkowych ze względu na dużą kumulację błędu podczas operacji na dużej ilości liczb. Bibliografia: *1+ Derivation of Respiratory Signal from Single-Channel ECGs Based on Source Statistics, Shuxue Dingab, Xin Zhua, Wenxi Chena, Daming Weia, International Journal of Bioelectromagnetism (Vol. 6, No. 1). *2+ Wavelet-Based Cascaded Adaptive Filter for Removing Baseline Drift in Pulse Waveforms, Lisheng Xu, David Zhang, Kuanquan Wang AGH 2001. *3+ Przetwarzanie sygnałów elektrodiagnostycznych, Piotr Augustyniak, Wydawnictwa DODATEK A: Opis opracowanych narzędzi i metody postępowania Program był pisany w języku C w standardzie ANSI z wykorzystaniem biblioteki OpenCV 1.0 dla wizualizacji wyników. Środowiskiem tworzenia aplikacji był pakiet NetBeans IDE 6.9.1 z narzędziami Cygwin do kompilacji. Pliki binarne znajdują się w folderze /bin. -7-
Program uruchamia się następującą komendą: p_sygn.exe [plik wejściowy z odprowadzeniami] [plik z indeksami zespołów QRS] Po uruchomieniu otwierają się cztery okna: Terminal z wartościami liczbowymi. Okno z sygnałem. Okno z prezentacją wektorów wypadkowych. Okno z wizualizacją sygnału oddechu. DODATEK B: Realizacja proponowanego rozwiązania Program był kompilowany i testowany w systemie Windows 7 64-bit. Korzysta z plików binarnych biblioteki OpenCV w wersji 1.0, w szczególności z modułu HighGUI do wyświetlania wyników. Napisany jest w całości w języku C. Przeszkodę w tworzeniu projektu stanowił brak odpowiednich danych wejściowych i imlpementacji referencyjnej do sprawdzania poprawności wyników. W przypadku operacji na liczbach zmiennoprzecinkowych typ danych float nie był w stanie pomieścid sumy dużej ilości próbek dla wyznaczenia najlepszych dwóch odprowadzeo. Typ double był lepszy ale ostatecznie postanowiliśmy rzutowad wszystko na zbiór liczb całkowitych po odpowiednim przeskalowaniu, gdyż znacznie ułatwiało to współpracę z biblioteką OpenCV. Folder zawiera przykładowe pliki wejściowe input.txt i odpowiadający mu qrs.txt. Są to odczyty z bazy MIT-BIH Arrhythmia Database i przypisane im zespoły QRS. Pliki dll wymagane do uruchomienia: cxcore100.dll cv100.dll highgui100.dll cygwin1.dll libguide40.dll -8-
DODATEK C. Opis informatyczny procedur Projekt składa się z trzech plików źródłowych: main.c główny plik funct.h nagłówek dla funkcji funct.c plik ze źródłami wykorzystywanych funkcji: Makrodefinicje long int max_amp(int tab[], int limit); - funkcja zwracająca średnią wartośd amplitudy potrzebną do określenia najlepszych odprowadzeo. int* sum_sqr(int tab[][limit], int qrs[][qrs_limit], int qrs_limit, int channel1, int channel2); - funkcja znajdująca maksimum paraboli dopasowanej do zespołów QRS w oparciu o funkcję pseudomodułu. void visualize(int tab[][limit], int qrs[][qrs_limit], int tab_limit, int qrs_limit, int* max); - funkcja wyświetlająca sygnały w pierwszych trzech odprowadzeniach. void show_vector(int **tab, int limit); - funkcja wyświetlająca umiejscowienie wektora wypadkowego. void get_and_show_r_signal(int **tab, int limit); - funkcja obliczająca i wyświetlająca sygnał oddechu. LIMIT maksymalna ilośd próbek wczytanych z pliku (dla input.txt <=4000). QRS_LIMIT - maksymalna ilośd zespołów QRS wczytanych z pliku. Kluczowe elementy kodu: main.c qrs_max = sum_sqr(conv, QRS1, qrs_count, i_max1, i_max2); // przedziały gdzie parabola ma największą wartość if(qrs_max!= NULL) //angle = (double*)malloc(qrs_count * sizeof(double)); sum = (int**)malloc(qrs_count * sizeof(int*)); for(i=0; i<qrs_count; i++) sum[i] = (int*)malloc(2 * sizeof(int)); for(i=0; i<qrs_count; i++) printf("max paraboli: %d\n", qrs_max[i]); for(i=0; i<qrs_count; i++) // oblicznie wektorów z wartości funkcji trygonometrycznych vector1[0] = conv[0][qrs_max[i]]; -9-
vector2[0] = 0.5 * conv[1][qrs_max[i]]; vector3[0] = -0.5 * conv[2][qrs_max[i]]; vector1[1] = 0; vector2[1] = -sqrt(3)/2 * conv[1][qrs_max[i]]; vector3[1] = -sqrt(3)/2 * conv[2][qrs_max[i]]; vector3[0]); vector3[1]); sum[i][1]); //oblicznie wektora wypadkowego sum[i][0] = (int)(vector1[0] + vector2[0] + sum[i][1] = (int)(vector1[1] + vector2[1] + printf("wektor wypadkowy[x,y]: [%d][%d]\n", sum[i][0], ----------------------------------------------------------------- funct.c long int max_amp(int tab[], int limit) int i; long int sum = 0; for(i=0; i<limit; i++) sum += abs(tab[i]) + tab[i]; // metoda ustalania największej amplitudy return sum/limit; int* sum_sqr(int tab[][limit], int qrs[][qrs_limit], int qrs_limit, int channel1, int channel2) int i, j, k, max, *i_max; long int sum; i_max = (int*)malloc(qrs_limit * sizeof(int)); for(i=0; i<qrs_limit; i++) i_max[i] = 0; for(i=0; i<qrs_limit; i++) max = 0; for(j=qrs[0][i]; j<qrs[2][i]-6; j+=2) sum = 0; for(k=0; k<6; k++) sum += tab[channel1][j+k] * tab[channel1][j+k] + tab[channel2][j+k] * tab[channel2][j+k]; if(sum > max) //odpowiednik dopasowania paraboli max = sum; i_max[i] = j+3; -10-
return i_max; DODATEK D. Spis zawartości dołączonych nośników (dyskietek, CD ROMu) Bin o program wykonywalny o wymagane do uruchomienia biblioteki o plik wejściowy z odprowadzeniami o plik z indeksami zespołów QRS Doc o Raport w formacie DOC i PDF o Prezentacja w formacie PPT i PDF Src o Pliki nagłówkowe o Pliki źródłowe o Makefile -11-