AKADEMIA GÓRNICZO-HUTNICZA im. St. Staszica w Krakowie WEAIiE, Katedra Automatyki Laboratorium Biocybernetyki Przedmiot: Temat projektu: Przetwarzanie sygnałów w systemach diagnostyki medycznej PR04307 Detekcja zmienności rytmu serca Wykonali: Tomasz Jama Andrzej Gryboś Rok akademicki: 2010/2011, semestr zimowy Informatyka Stosowana V konsultant: dr hab. inż. Piotr Augustyniak v 1.4 Kraków, 01.19.2010
Spis treści 1.Abstrakt...3 2.Wstęp...3 3.Analiza złożoności i estymacja zapotrzebowania na zasoby...4 4 Koncepcja proponowanego rozwiązania...4 5. Symulacja i Testowanie...7 6. Rezultaty I wnioski...7 7. Podsumowanie...8 8. Literatura...8 Dodatek A: Opis narzędzi...9 Dodatek B: Dokumentacja techniczna...9
1.Abstrakt Pogram DetektorHRV analizuje zmienność rytmu serca (HRV) ma podstawie interwałów międzyuderzeniowych (odstepy RR) w trzech dziedzinach: Czasu za pomocą metod statystycznych Gemoetrycznej Częstotliwościopwej z wykorzystaniem FFT Udało nam się osiągnąć wszystkie założenia. Postawły program jest prosty i przejrzysty. Analiza zwraca poprawne wyniki i działa bardzo szybko. 2.Wstęp a) Cel Projektu Celem projektu jest zaimplementowanie algorytmu wyznaczania parametrów czasowych (statystycznych), częstotliwościowych i geometrycznych zmienności rytmu serca na podstawie sekwencji interwałów RR pochodzenia zatokowego. Implementacja powinna obsługiwać pojawienie się pobudzeń zastępczych oraz powinna być kompatybilna ze strukturami opisu sygnału EKG i sterującymi. b) Zarys ogólny proponowanego rozwiązania Do przeprowadzenia analizy zmienności rytmu serca w dziedzinie czasu metodami statystycznymi i gemoetrycznmi sami zaimplentowaliśmy odpowiednie działania matematyczne. Połączyliśmy je w jedną metodę aby zmniejszyć złożoność czasową programu. Do analizy częstotliwościowej wykorzystalismy dwie biblioteki: FFTW do przeprowadznia szybkiej transformaty fouriera ALGLIB do przeprowadzenia aproksymacji z użyciem funkcji sklejanej trzeciego stopnia c) Dyskusja alternatywnych rozwiązań Do obliczenia widma sygnału można było zastosować techniki autokorelacyjne, jednak ze względu na nasze większe doświadczenie z FFT i dużą ilość dobrych bibliotek zdecydowaliśmy się pozostać przy FFT.
3.Analiza złożoności i estymacja zapotrzebowania na zasoby Nasz program przeznaczony jest na PC i po skompilowaniu wraz z bibliotekami zajmuje niecałe 2 MB. Złożoność pamięciowa i czasowa wynosi O(n). Ze względu na to że jako dane wejściowe otrzymujemy już przetworzone wyjście innego modułu (analizy QRS) zapotrzebowanie na pamięć jest niewielkie. 4 Koncepcja proponowanego rozwiązania Nasz program wczytuje piliki z zapisami atrybutów zespołów QRS (qrs_attr.out). Interesuje nas w szczególności trzecia i piąta kolumna: lokalna wartosc interwalu miedzyuderzeniowego [ms] oraz typ morfologii. Po wczytaniu danych wywołujemy funcję analizastatgeo() która dokonuje analizy statystycznej i geometrzycznej. Połączylismy te dwie osobne części w jedną aby uniknąć niepotrzebnych przebiegów po danych. Statystyczne parametry które wyznaczamy: Ilosc calkowita zespolow qrs w zadanym odcinku czasu ilosc zespolow dominujacych w zadanym odcinku czasu usredniona wartosc interwalu RR [ms]: wariancja interwalow RR odchylenie standardowe interwalow RR (SDNN)
RR (RMSSD) Pierwiastek kwadratowy ze średniej kwadratów różnic pomiędzy dwoma interwałami Średnia z odchyleń standardowych interwałów RR w 5 minutowych segmentach czasu całego zapisu [ms] (SDANN index) Odchylenie standardowe ze wszystkich średnich interwałów RR w 5 minutowych segmentach czasu całego zapisu [ms] (SDANN) Liczba interwałów RR które przekraczają 50 ms (NN50) Odsetek róznic pomiędzy interwałami RR które przekraczają 50ms (p50nn) Gemoetryczne parametry: Indeks trójkątny ilość słupków w podstawie trójkąta histogramu odstepów RR rytmu zatokowego TINN długość podstawy trójkąta aproksymującego histogram kolejnych odstępów RR rytmu zatokowego Wyznaczenie parametrów częstotliwościowych jest bardziej skomplikowane i wymaga wcześniejszego przygotowania danych. Zaczynamy od odtworzenia ciągłej funkcji czasu na podstawie posiadanych danych. W tym celu korzystamu aproksymacji cubic spline z biblioteki ALGLIB. Nastepnie powstałą funkcję próbkujemy jednorodnie co 1s (1Hz). Na tak uzyskanym sygnale wykonujemy FFT i otrzymane dane przetwarzamy na wartości widma. Dzięku temu możemy dokonać pomiaru prametrów częstotliwościowych:
HF moc widma w zakresie częstotliwości wysokich (0,15 0,4 Hz) LF moc widma w zakresie częstotliwości niskich (0,04 0,15 Hz) VLF moc widma w zakresie częstotliwości bardzo niskich (0,0033-0,04 Hz) ULF moc widma w zakresie częstotliwości utra niskich (poniżej 0,0033 Hz) NHF Znormalizowana moc widma w zakresie częstotliwości wysokich NLF Znormalizowana moc widma w zakresie częstotliwości niskich LF/HF Wartość stosunku mocy LF/HF Otrzymane wyniki jednocześnie zapisujemy do pliku hrv_attr.out i wyświetlamy na standardowym wyjściu.
5. Symulacja i Testowanie Przy pomocy dostarczonej przez profesora bazy sygnałów holterowskich przetestowaliśmy nasz program na przykładowych zapisach. Uruchamialiśmy nasz program podając mu jako argument kolejne nazwy pliku z danymi QRS i zapisywaliśmy otrzymane wyniki. 6. Rezultaty I wnioski Uzyskane przez nasz program wyniki nie zawsze pokrywają się dokładnie z referencyjnymi, jednak różnice są raczej niewielkie. Przykładowe wyniki które uzyskaliśmy z próbek testowych: Illustration 1: Plik ah_21_1.dcm Różnice w analizie częstotliwościowej mogą być spowodowane wyborem innej metody tworzenia widma. Być może różnice w metodach statystycznych spowodowane są błędami numerycznymi i zaokrągleniami, jednak nie są to skomplikowane obliczenia.
Czasami różnice występują w dość prostych metodach i podejrzewamy że w plikach referencyjnych mogą występować błędy. 7. Podsumowanie Uważamy że spełniliśmy wszystkie założenia i program działa prawidłowo. Postaraliśmy się również aby program był dobrze udokumentowany i przejrzysty aby w razie potrzeby mógł zostać rozbudowany lub ulepszony w przyszłości. 8. Literatura [1] Augustyniak P., Przetwarzanie sygnałów elektrodiagnostycznych Uczelniane Wydawnictwa Naukowo-dydaktyczne AGH, Kraków, 2001. [2] Heart Rate Variability - Standards of Measurement, Physiological Interpretation, and Clinical Use, http://circ.ahajournals.org/cgi/content/full/93/5/1043 [3] Kenneth C. Bilchick, MD, Ronald D Berger, MD, PhD, Heart Rate Variability: Frequency Domain Measures of HRV, Johns Hopkins Medical Institutions, Baltimore, Maryland, USA [4] http://www.adinstruments.com/solutions/research/hrv/ [5] http://www.ncbi.nlm.nih.gov/pubmed/3812275 [6] http://www.ncbi.nlm.nih.gov/pubmed/10333974 [7] http://www.ncbi.nlm.nih.gov/pubmed/7987529 [8] http://przyrbwn.icm.edu.pl/app/pdf/118/a118z1p31.pdf [9] FFTW 3.2.2, http://www.fftw.org/ [10] ALGLIB 3.2.0 http://www.alglib.net/
Dodatek A: Opis Narzędzi Nasz projekt pisaliśmy w środowisku Code::Blocks w C++. Korzystaliśmy z kompilatora gcc w wersji 4.4.5 oraz następujących bibliotek: FFTW darmowa, bardzo szybka biblioteka do obliczania transformaty fouriera. ALGLIB darmowa biblioteka do analizy numerycznej, potrzebowaliśmy jej do przeprowadzenia interpolacji tachogramu. Dodatek B: Dokumentacja techniczna Detailed Description Klasa Detektor. Jest to glowna klasa programu. Wczytuje plik z danymi zalamkow QRS i dokonuje analizy HRV Constructor & Destructor Documentation Detektor::Detektor() Konstruktor. Nie potrzebuje zadnych parametrow Member Function Documentation void Detektor::analiz aczest ( ) Analiza Czestotliwosciowa. Dokonuje analizy czestotliwosciowej HRV na wczytanych wczesniej zalamkach QRS void Detektor::analiz astatgeo ( )
Analiza Statystyczna i Geometryczna. Dokonuje analizy statystycznej i geometrycznej HRV na wczytanych wczesniej zalamkach QRS Oblicza ilosc zespolow dominujacych w zadanym odcinku czasu void Detektor::loa dfile ( char * filename ) Metoda loadfile. Wczytuje podany plik z danymi QRS Przetwarza go do postaci wektora struktur QRS_ATTR Parameters: filename nazwa pliku w postaci tablicy znakow z jego nazwa