AKADEMIA GÓRNICZO-HUTNICZA im. St. Staszica w Krakowie WEAIiE, Katedra Automatyki Laboratorium Biocybernetyki Przedmiot: Przetwarzanie sygnałów w systemach diagnostyki medycznej. Temat projektu: Obliczenie dyspersji odcinka QT Spis treści: 1. Wstęp... 2 2. Koncepcja proponowanego rozwiązania... 2 3. Rezultaty i wnioski... 3 4. Podsumowanie... 4 5. Literatura... 5 6. Dodatek A: Realizacja proponowanego rozwiązania... 5 6.1 Opis algorytmu... 5 6.2 Realizacja... 6 7. Dodatek B: Opis procedur informatycznych...... 7 7.1 Dokumentacja techniczna..... 7 7.2 Dokumentacja użytkowa... 8 8. Dodatek C: Spis zawartości... 9 Wykonali: Robert Pustułka V rok Informatyki Stosowanej konsultant: dr hab. inż. Piotr Augustyniak Wersja 1.0 Kraków, 2011
1. Wstęp Długość odcinka QT ma wielkie znaczenie dla diagnostyki repolaryzacji serca (załamek T wskazuje na moment repolaryzacji serca). Długość tego odcinka może się znacznie różnić w poszczególnych odprowadzeniach w danym uderzeniu serca, co wskazuje na niejednorodność zachodzenia procesów repolaryzacji. Analiza dyspersji odcinka QT pozwala na określenie zagrożenia wystąpienia arytmii czy migotania komór. Daje również między innymi możliwość kontroli bezpieczeństwa leczenia oaz wpływu leków na wystąpienie arytmii. 2. Koncepcja proponowanego rozwiązania Literatura proponuje kilka aproksymacyjnych metod poszukiwaniu końca załamka T w różnych odprowadzeniach. Wspólnym dla nich jest założenie współbieżności rejestrowanych sygnałów oraz ustalenie jednego punktu detekcji QRS w danym uderzeniu serca dla wszystkich odprowadzeń. Wyznaczony koniec załamka T może być jedynie punktem wyjściowym dla dokładniejszego wyznaczenia załamka w poszczególnych odprowadzeniach. Do najpopularniejszych rozwiązań należą te wymienione w [1]. Jedno z nich polega na wyznaczeniu stycznej do zstępującego ramienia T oraz wyznaczenia punktów przecięcia przez styczną linii izoelektrycznej i wartości maksimum załamka T. Następnie odkłada się na izolinii odcinek odpowiadający przecięciu stycznej z punktem maksimum. Koniec odcinka na izolinii jest końcem załamka T. Inne rozwiązanie wykorzystuje dopasowanie paraboli do kolejnych punktów na zstępującym ramieniu załamka T po punkcie największej prędkości spadku. Wierzchołek tak powstałej paraboli jest końcem załamka T. W tej pracy zdecydowano się na wykorzystanie innej metody zaproponowanej przez Zong et al. w [2] a właściwie pewnego jej uproszczenia. W pełnej wersji metoda ta zakłada podobnie jak poprzednio znajomość punktu detekcji Q oraz ponadto długość zespołu QRS. Na proponowany algorytm składa się filtracja sygnału filtrem dolnoprzepustowym o odcięciu 16Hz dla sygnału o częstotliwości próbkowania 250Hz, a następnie usunięcie odcinka P-QRS oraz zaaplikowanie transformaty uwydatniającej załamek T (Rysunek 1). W tak powstałym sygnale w danym przedziale poszukuje się maksimum i prowadzi półprostą zaczepioną na izolinii w kolejnym punkcie detekcji QRS oraz styczną do znalezionego maksimum (Rysunek 2). Maksymalna odległość sygnału od stycznej wskazuje na koniec załamka T.
Rysunek 1. Przekształcenie sygnału EKG. Rysunek 2. Wyznaczenie maksimum i stycznej. W opisywanej pracy wprowadzono uproszczenia polegające na rezygnacji z przeprowadzania transformaty i usuwania fragmentu odpowiadającego odcinkowi P- QRS, a zamian za to zdecydowano się na poszukiwanie lokalnego ekstremum (minimum lub maksimum przez wzgląd na różną orientację załamka T w różnych odprowadzeniach) na przedziale od końca QRS do początku kolejnego P-QRS oraz zastosowaniu wspomnianej metody stycznych i poszukiwania maksymalnej odległości. Dokładniejszy opis procedury znajduje się w Dodatku A. Tak zaprojektowany algorytm został następnie użyty w metodach obliczania odcinka QT oraz jego dyspersji przy kolejnych uderzeniach serca. 3. Rezultaty i wnioski Zaprezentowany algorytm wykazał dość wysoką skuteczność odnajdywania załamków T. Jego skuteczność można oszacować na ok 99% (szczegółową ilość błędów w odpowiednich próbach przedstawia Tabela 1).
zapis ah_21_1.dcm ah_21_2.dcm ah_21_3.dcm ah_21_4.dcm ilość załamków 1067 1409 1071 947 ilość niewykrytych zał.t 3 14 11 26 procent 0,3% 1% 1% 2,7% Tabela 1: Niewykryte załamki T Inaczej przedstawia się precyzja detekcji załamków T. Niestety nie posiadamy danych referencyjnych, dzięki którym moglibyśmy porównać odnalezione załamki z rzeczywistymi ich lokalizacjami. Jednak dzięki temu, iż algorytm został zaimplementowany również w pakiecie MATLAB (poza standardową implementacją w C), pozwoliło to na wzrokowe oszacowanie precyzji detekcji. Można ją określić jako około 80-85% optycznie poprawnych wyników. Jednak jest to tylko orientacyjna wartość, dokładniejsze testy wymagałyby sporządzenia odpowiednich metod i konsultacji specjalisty. Bardzo często, w przypadkach dużych schyłków izolinii na odcinku ST szczyt załamka T błędnie lokalizowany jest w jego końcu, a punkt T-end odnajdywany jest nieco dalej, w okolicach załamka U lub P. Skutkuje to w znacznie wydłużonym odcinku QT, co też rzutuje na poprawność wyników obliczania dyspersji tego odcinka. Zdarza się, iż maksymalna długość QT w odprowadzeniu znacznie odbiega od wartości RMS. 4. Podsumowanie Wykorzystana metoda jako pewna forma alternatywnego rozwiązania w stosunku do najpowszechniej używanych algorytmów opisanych w [1] oraz rozdziale 2. okazuje się być całkiem skuteczna. Charakteryzuje ją wysoki współczynnik odnajdywania załamków, jednak o niższej precyzji ich lokalizacji. Częściowa implementacja tej metody zaprezentowana w tym projekcie daje satysfakcjonujące wyniki i zachęca z pewnością do pełnego jej zaimplementowania według wytycznych podanych w literaturze ([2]), co już w tym momencie jest jedną z propozycji rozwoju projektu. Z pewnością przydatne byłyby też bardziej miarodajne metody testowania. Zaproponować można również pewną optymalizację stworzonego programu.
5. Literatura [1] Augustyniak Piotr, Przetwarzanie sygnałów elektrodiagnostycznych, Wyd. AGH, Kraków 2001 [2] Zong W., Saeed M., Heldt T., A QT Interval Detection Algorithm Based on ECG Curve Length Transform, 2006 6. Dodatek A: Realizacja proponowanego rozwiązania 6.1 Opis algorytmu Odczytujemy z pliku sygnał holterowski oraz kolejne punkty detekcji QRS. Każde odprowadzenie filtrujemy filtrem dolnoprzepustowym określonym przez funkcję: y[n] = 2*y[n-1] - y[n-2] + x[n] - 2*x[n-5] + x[n-10] Dzięki temu pozbywamy się stałej składowej sygnału oraz szumów. Dla każdego odprowadzenia poszukujemy odcinka QT w przedziale jednego uderzenia serca ograniczonym przez początek obecnego i kolejnego QRS. Punkt detekcji QRS mamy podany jako parametr, więc skupiamy się na odszukaniu końca załamka T. Dokonujemy tego metodą stycznej. Wprowadzamy pewne oszacowania jedynie w celach orientacyjnych długość QRS ustalamy jako 0.25 odległości pomiędzy początkami kolejnych QRSów odległość PQ kolejnego uderzenia serca ustalamy jako 0.15 odległości j/w W zakresie od końca QRS do początku kolejnego P poszukujemy pierwszego ekstremum lokalnego. Ten punkt określamy jako szczyt załamka T. W celu odnalezienia końca załamka T prowadzimy prostą przechodzącą przez punkt detekcji załamka P kolejnego uderzenia serca i styczną do szczytu załamka T. Poszukujemy pierwszej lokalnie maksymalnej odległości sygnału od poprowadzonej prostej. Punkt najbardziej oddalony od prostej oznaczamy jako koniec załamka T. Dla każdego uderzenia serca spośród odległości QT odnalezionych w każdym odprowadzeniu poszukujemy maksimum oraz obliczamy wartość średniokwadratową (RMS) odległości.
Rysunek 3: Szkic proponowanego rozwiązania 6.2 Realizacja Algorytm poszukiwania końca załamka T w celu wizualizacji i łatwiejszego debugowania początkowo był prototypowany w pakiecie MATLAB z wykorzystaniem bazy CSE (m.in. przez wzgląd na obecność gotowych funkcji pakietu MATLAB pozwalających na odczyt zapisów). Pozwoliło to na szybsze wychwycenie błędów dzięki możliwości rysowania prostych wykresów. Następnie algorytm został przepisany do języka C i wpleciony w metody poszukiwania odcinków QT w każdym odprowadzeniu przy kolejnych uderzeniach serca. Powstały funkcje odczytujące danych z plików z bazy zapisów sygnałów holterowskich przekazanej na cele wykonania projektu.
7. Dodatek B: Opis procedur informatycznych 7.1 Dokumentacja techniczna int** readfile(char* path, int* size) Funkcja odpowiada za odczytanie pliku z sygnałami holterowskimi (zapisami binarnymi kolejnych próbek w postaci liczby 8-bitowej bez znaku) i zapisaniem jej w odpowiedniej tablicy. Do funkcji przekazywany jest wskaźnik na tablicę char zawierającą ścieżkę do pliku oraz wskaźnik na integer, pod którym zapisany zostaje rozmiar sygnału (ilość próbek) w pojedynczym odprowadzeniu. Zwracany jest wskaźnik na tablicę dwuwymiarową zawierającą kolejne wartości próbek w każdym odprowadzeniu (ilość odprowadzeń określona przez stałą LEAD_COUNT). int* lopass (int *signal, int size) Jest to funkcja, która aplikuje filtr dolnoprzepustowy określony odpowiednim wzorem (y[n] = 2*y[n-1] - y[n-2] + x[n] - 2*x[n-5] + x[n-10]) usuwając szumy i stałą składową sygnału. Przyjmuje wskaźnik na tablicę integerów przechowującą dany sygnał oraz zwraca wskaźnik na przetworzony sygnał. int findfirstlocalextr (int *x, int Sa, int Sb, int surr) Funkcja odnajduje pierwsze lokalne ekstremum sygnału przekazanego w postaci tablicy w zakresie określonym przez wartości Sa i Sb przekazane jako argumenty funkcji. Wartość ekstremum powinna być odpowiednio wyższa lub niższa od wartości sygnału w otoczeniu określonym przez surr. Zwracany jest numer próbki w sygnale. W przypadku nie odnalezienia maksimum zwracana jest wartość -1. int* findmaxlength(int *x, int A, int B, int C, int Sa, int Sb) Jest to funkcja znajdująca pierwszą lokalnie maksymalną odległość sygnału przekazanego do funkcji w postaci tablicy od prostej wyznaczonej przez parametry A, B i C (wg. wzoru na prostą Ax+Bx+C=0) w zakresie ograniczonym wartościami Sa i Sb. Zwracany jest wskaźnik na trójelementową tablicę zawierającą kolejno numer próbki, w którym wspomniana odległość jest największa, wartość próbki oraz odległość od prostej.
int findqtinterval (int* LPsignal, int size, int QstartC, int QstartN) Funkcja odnajduje w jednym przebiegu przefiltrowanego sygnału holterowskiego w zakresie określonym przez punkt detekcji dwóch sąsiednich zespołów QRS długość odcinka QT. Do funkcji przekazywane są: wskaźnik na tablicę zawierającą kolejne próbki sygnału, parametry QstartC i QstartN określające początki sąsiednich zespołów QRS oraz rozmiar tablicy size. Zwracana jest wartość będąca długością odcinka QT w określonym uderzeniu serca w postaci ilości próbek pomiędzy początkiem Q a końcem T. W programie głównym następuje odczytanie z pliku sygnałów holterowskich (przy pomocy funkcji readfile oraz punktów detekcji zespołów QRS. Następnie dla każdego uderzenia serca w każdym odprowadzeniu poszukiwana jest długość odcinka QT, z tych wartości później zostają obliczone wartość maksymalna oraz wartość średniokwadratowa w sekundach. Wynik zwracany jest na wyjście standardowe, dla każdego uderzenia wartość maksymalna oraz wartość RMS w jednej linii (postać: [wart max] [wart RMS]\n ). Podane wartości są zwracane w sekundach, typ danych to float. 7.2 Dokumentacja użytkowa Standardowo program uruchamiamy poleceniem: qtfinder [argument] gdzie argumentem jest nazwa folderu w katalogu bieżącym zawierającym dwa pliki: plik [nazwa folderu].dcm zawierający zapis sygnału oraz qrs_attr.out, w którym znajdują się m.in. punkty detekcji kolejnych zespołów QRS. Jest to sposób uruchomienia zoptymalizowany pod dostarczoną studentom bazę zapisów. Przykład użycia: qtfinder ah_21_1 otwarte pliki:./ah_21_1/ah_21_1.dcm oraz./ah_21_1/qrs_attr.out Alternatywnym poleceniem jest: qtfinder [path] [dcm file] [qrs file]
[path] to ścieżka do folderu zawierającego pliki dcm o podanej w drugim argumencie nazwie oraz plik zawierający punty detekcji QRS przekazany jako trzeci argument relatywnie do [path]. Przykład użycia: qtfinder baza/ah_21_2 ah_21_2.dcm../qrs_attr.out otwarte pliki:./baza/ah_21_2.dcm oraz./qrs_attr.out Program zwraca na wyjście standardowe kolejne linie postaci: [wart max] [wart RMS]\n, co odpowiada w pierwszej kolejności maksymalnej długości odcinka QT ze wszystkich odprowadzeń oraz wartości średniokwadratowej tych długości. 8. Dodatek C: Spis zawartości Lista katalogów: doc dokumentacja (raport) z projektu exe plik wykonywalny skompilowany pod Windows 7 64-bit (plik qtfinder-win64.exe) ref literatura w plikach PDF res baza zapisów sygnałów holterowskich src pliki źródłowe programu matlab prototyp algorytmu zrealizowany w pakiecie MATLAB nie jest to projekt do oceny, jedynie forma raportu z części wykonanej pracy