mateuszbaran / ECG-analyzer

Main ECG-analyzer repository
GNU General Public License v2.0
45 stars 38 forks source link

Wykresy - należy zaznaczyć załamki R #34

Open fuko-fabio opened 11 years ago

fuko-fabio commented 11 years ago

Grupa zajmująca się wykresami powinna nanieść załamki R na wykres po ich wykryciu.

strasznyobibok commented 11 years ago

Po poprawieniu Waszego kodu, aby się kompilował przy GCC (nie wiem, jak działa kompilator Visuala, ale w zasadzie std:min powinny przyjmować dwa argumenty tego samego typu --- RPeaksDetector.cpp linjka 1437), wywołuję ręcznie metodę runRPeaks(); i dostaję w zamian:

R peaks module started

Use mocked signal for R-peaks module.
Cannot read mocked signal.
Running module with default parameters
Convolution [-0.125 -0.25 0.25 0.125]
Orginal signal size:  600000
Exponentiation ^2
Signal size after convolution:  599996
Moving window integration
Window size:  24
Signal size after exponentiation:  599996
Calculating detection thersold
After moving window integration signal size:  599972
Final max value for channel one:  0
Final mean value:  0

Current thresold value:  0
Looking for points over thersold
Detect begin and end of QRS complex
Number of left points:  0
Number of right points:  0
Final R peaks detection
R peaks not detected. Check input signal.
R peaks detection module fails
R peaks detection module fails
Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt. You must
reimplement QApplication::notify() and catch all exceptions there.

libc++abi.dylib: terminate called throwing an exception
Abort trap: 6
fuko-fabio commented 11 years ago

Rezultat odpalenia tego u mnie na Ubuntu oraz Windows poniżej:

Thersold size not found, use automatic calculated value Input parameters for R peaks module: Detection method: PanTompkins Moving window size: 0 Thersold size: 0 R peaks module started Use mocked signal for R-peaks module. Running module with custom parameters Convolution [-0.125 -0.25 0.25 0.125] Orginal signal size: 600000 Exponentiation ^2 Signal size after convolution: 599996 Moving window integration Window size: 24 Signal size after exponentiation: 599996 Calculating detection thersold After moving window integration signal size: 599972 Final max value for channel one: 0.0438604 Final mean value: 0.00221016

Current thresold value: 0.0109651 Looking for points over thersold Detect begin and end of QRS complex Number of left points: 2093 Number of right points: 2093 Final R peaks detection Number of detected R-peaks: 2093 Done

Według logów nie wczytuje ci zmockowanego sygnału który znajduje się w ECG-analyzer/mocks/FilteredSignal.txt sprawdź czy masz ten plik, jeśli tak to zerknij na funkcje RPeaksDetector::getMockedSignal() i sprawdź czemu nie wczytuje ci sygnału.

Odpalanie mojego modułu na sygnale dostarczonym z BaseLine zakończy się Exception-em. Przynajmniej tak do tej pory jest ponieważ dostanie od nich niepoprawny sygnał.

W pliku RPeaksDetector.h odkomentuj USE_MOCKED_SIGNAL.

Powinieneś dostać wektor tak jak pokazałem to powyżej.

piotrm commented 11 years ago

W tym momencie (od 5 min) w master znajduje się moduł usuwający baseline zwracający poprawnie znormalizowany sygnał. Z tego co widać jest on odpalany z domyślnymi ustawieniami przy wczytaniu sygnału z pliku. Dopóki nie zmergeuje obslugi Butterwortha i Chebysheva i ich parametrów wczytywanych z gui to niech tak pozostanie.

strasznyobibok commented 11 years ago

@piotrm, prawdopodobnie coś przy tym zespułeś:

[ 39%] Building CXX object CMakeFiles/ecg-analyzer.dir/ECGController.cpp.o
/Users/matt/Studies/ECG/ECG-analyzer/ECGController.cpp:3:29: fatal error: BaselineRemoval.h: No such file or directory
compilation terminated.
make[2]: *** [CMakeFiles/ecg-analyzer.dir/ECGController.cpp.o] Error 1
make[1]: *** [CMakeFiles/ecg-analyzer.dir/all] Error 2
make: *** [all] Error 2
piotrm commented 11 years ago

BaselineRemoval.h i.cpp zostały przemianowane na ECGBaselineRemoval, żeby utrzymać konwencję. Widocznie nie zmieniłem #include w ECGController. Już to poprawiam

piotrm commented 11 years ago

Ok, poprawka zacommitowana.

fuko-fabio commented 11 years ago

ECG-analyzer/ECGController.cpp:3:29: fatal error: BaselineRemoval.h: Nie ma takiego pliku ani katalogu compilation terminated. make[2]: * [CMakeFiles/ecg-analyzer.dir/ECGController.cpp.o] Błąd 1 make[1]: * [CMakeFiles/ecg-analyzer.dir/all] Błąd 2

strasznyobibok commented 11 years ago

Dobra. Poprawiłem wszystko i jakoś się kompiluje. Jeszcze nie testowałem... Co to jest Snr.cpp?

strasznyobibok commented 11 years ago

OK, Panowie, jest postęp.

Current thresold value:  0.00182111
Looking for points over thersold
Detect begin and end of QRS complex
Number of left points:  4869
Number of right points:  4869
Final R peaks detection
Number of detected R-peaks: 4869
Done
Detecting qrs-onset and qrs-end
Minimal value 0.00086848
Macimal value 1.10735
Rpeak no 0 value :0
gsl: ../gsl/gsl_vector_double.h:180: ERROR: index out of range
Default GSL error handler invoked.
piotrm commented 11 years ago

Plik z klasą do liczenia jakości filtrów. Można na razie je usunąć, ale jeszcze przed północą pojawią się tam metody.

strasznyobibok commented 11 years ago

Możesz dać mi sygnał, na którego przefiltrowanym mockupie pracujesz? (czy jest to sygnał o numerze 100?)

fuko-fabio commented 11 years ago

to jest sygnal 100. Najlepiej testuj to uruchamiajac metode wykrywania "Hilbert". Po lewej zakładka digital filters -> detection method. Mozesz wylaczyc zamockowany sygnal bo juz dziala na tych wczytywanych.

strasznyobibok commented 11 years ago

1) jeżeli działa na wczytywanych, to nie u mnie, niestety 2) jest problem... mianowicie: rozumiem, że wskazujesz na piki w przefiltrowanym (a co za tym idzie, przesuniętym odrobinę sygnale względem oryginału). Chcesz, zebym wyświetlił Twoje piki na przefiltrowanym sygnale? Jeżeli tak, to przefiltrowany sygnał niestety nie ma dwóch kanałów i nie mogę wyświetlić, jak dotychczasowy, surowy.

fuko-fabio commented 11 years ago

Wskazuje na przefiltrowany bo do innego nie mam odstepu, wiec narazie proponuje to pokazac tak jak jest zeby bylo widac rezultat. Co do przesuniecia to nie wiem czy BaseLine nie powinno przypadkiem dostarczyc mi sygnalu bez przesuniec bo ja nie jestem wstanie okreslic o ile sie przesunal :/

strasznyobibok commented 11 years ago

Tego się obawiałem... Pięciak naciskał na to, żeby przetwarzać oba kanały. Rozumiem, że to jednak jest ponad nasze siły. No nic, ręcznie sprawdzę to przesunięcie domyślne, żeby chociaż było ładnie widać przy uruchomionym przykładzie...

piotrm commented 11 years ago

Poszła w pewnym momencie informacja, że ma być tylko jeden kanał brany pod uwagę. Mogę na szybko udostępnić metodę filtrującą, działającą na obu kanałach. Co do przesunięcia - to szczerze powiedziawszy pierwsze słyszę, że taki problem się pojawia...?

fuko-fabio commented 11 years ago

Każdy moduł musiał by wprowadzać analizę dwóch kanałów wiec muzę sobie darujmy, u mnie za dużo zmian.

strasznyobibok commented 11 years ago

Nieno spoko, może ja jestem nie na bieżąco, a my i tak nie jesteśmy w stanie dobrze jednego kanału przetworzyć, o dwóch szkoda gadać ;) Gdybyś dodał drugi kanał, trzeba byłoby pewnie dla drugiego kanału przepisać wszystko raz jeszcze :dancers: Rozumiem, że przetwarzany jest jedynie pierwszy kanał.

Tak naprawdę to nie wiem, czy Twój filtr daje przesunięcie, ponieważ jeszcze nie udało mi się odpalić RPeaks bezpośrednio na wyniku jego działania (RPeaks się wywala standardowo). Być może tylko mockup ma przesunięcie. Tego nie wiem.

strasznyobibok commented 11 years ago

PS Przesunięcie wynosi około 20 próbek.

piotrm commented 11 years ago

Offtop przy okazji - Fs zawsze równe jest 360Hz w przypadku MIT-BIH?

strasznyobibok commented 11 years ago

Tak.

strasznyobibok commented 11 years ago

http://webcache.googleusercontent.com/search?q=cache:http://www.physionet.org/physiobank/database/mitdb/&hl=pl&tbo=d&strip=1

piotrm commented 11 years ago

Offtop nr 2. Polecicie dobry program do diagramów pod windowsa?

fuko-fabio commented 11 years ago

Informacje o częstotliwości możesz wyciągnąć z ecgInfo które powinno przychodzić do twojego modułu

strasznyobibok commented 11 years ago

Gliffy albo Cacoo, oba online we flashu bodajże.

Poza tym posucha, wszystko przeładowane opcjami, przez co nieporęczne i nieładne.

strasznyobibok commented 11 years ago

OK... Męczyłem się jak mogłem, żeby pokazać odfiltrowany sygnał i poległem. Nie udało mi się zmusić removeBaseline do pracy. W pewnej wersji się nie wysypywało, ale wynikiem były śmieci, które wysypywały ich wyświetlanie. Obecnie na porządku dziennym jest:

Assertion failed: (px != 0), function operator->, file /usr/local/include/boost/smart_ptr/shared_ptr.hpp, line 424.
Abort trap: 6

Chwilowo się poddaję, to nie na moje nerwy, wyświetlam rpiki przesunięte o 20 próbek w lewo na pierwszym nieprzefiltrowanym kanale.

howgh!