Witam Kolegów,
Mam prosty system mikroprocesorowy, który zbiera sygnał z optycznego czujnika tętna. Jako, że sygnał potrafi być zakłócony zastanawiam się nad najlepszym algorytmem do wyszukania częstotliwości badanego sygnału (tutaj tętna). Wszelkiej maści znajdowanie przejścia przez zero czy maksimów mogą tutaj nie sprawdzić się a DFT jest za bardzo skomplikowana dla tego układu. Może autokorelacja? robiw
Sprawdź to - nagraj sygnał z czujnika (oscyloskop czy wysłanie próbki przez mikroprocesor) i napisz na PC prosty program w C czy Pythonie i zobacz jaki będzie rezultat. Ale najprościej użyć jakiegoś ARM za pięć złotych i zrobić DFT.
Ja bym próbował całkować sygnał na próbkach o 2-krotnej spodziewanej długości impulsu tętna - na oko rzędu dziesiątek milisekund. Maksima lub zbocza tego impulsu wyznaczają odstępy czasowe pomiędzy uderzeniami tętna. Do wyniku wziąć należy uśrednioną i odfiltrowaną częstotliwość z kilku uderzeń.
A właśnie: z jaką częstotliwością zamierzasz dokonywać akwizycji danych?
Oscyloskop jest dobrym pomysłem, bo pozwoli oszacować siłę i kształt sygnału.
Im więcej próbek tym lepiej, ale może się uda i na 100Hz.
Jakich zakłóceń się spodziewasz? Niektóre można odfiltrować na poziomie sprzętu.
Bardziej od zakłóceń spodziewałbym się problemów ze wzmocnieniem sygnału i jego kondycjonowaniem. Poziom sygnału czujnika może zależeć od wielu czynników, więc dobrze byłoby automatycznie regulować wzmocnienie, żeby otrzymywać odpowiedni poziom sygnału. Za słaby sygnał nie pozwoli niczego wykryć a za mocny będzie zbyt nasycony. Czy możesz rzucić schematem obwodu wejściowego?
To dwa dokładnie te same schematy. Sygnał z diody odbiorczej jest filtrowany przez dwa filtry dolnoprzepustowe i do procesora.
robiw napisał:
niemniej jednak próbowałem już wielu.
A z czym dokładnie jest problem? Czy sprawdzałeś sygnał oscyloskopem na wejściach i wyjściach poszczególnych stopni filtrów? Sygnał może być obcięty do górnej połowy, bo stopnie wzmacniają tylko górną połowę sygnału. Jeśli nie masz oscyloskopu, to czy możesz wrzucić przykładowe dane zebrane przez procesor?
Wiem, że są dokładnie takie same. Moim zdaniem to dwa "komplety" filtrów pasywnych górnoprzepustowych (RC na wejściu) z aktywnym dolnoprzepustowym (OPAMP). Problem w tym, że nie mogę "złapać" jakiegokolwiek sensownego sygnału poza śmieciami...robiw
Problem w tym, że nie mogę "złapać" jakiegokolwiek sensownego sygnału poza śmieciami
Więc musisz przeanalizować tor pomiarowy oraz program. Może gdzieś jest problem z lutem, może źle zainicjowany przetwornik ADC... opcji jest mnóstwo, przyczyna nieraz banalna.
To się zgadza, ale testowałem już kilka układów i zero postępów. Sprawdzałem na oscyloskopie. Został mi jeszcze do sprawdzenia czujnik SFH7070. Ostatnio zakupiłem też gotowy czujnik z www.pulsesensor.com... i nic, zero użytecznego sygnału. Zaczynam dochodzić do wniosku, że palec mi nie działa ...robiw
Zasilacza DC. Mam zakłócenia 100Hz i poza tym żadnego użytecznego sygnału.
Stabilizowany? Jakie napięcie? Zasilasz wprost czy przez dodatkowy stabilizator? Czy zasilanie strony analogowej jest wydzielone i odfiltrowane? Czy sprawdzałeś zasilanie oscyloskopem? Jaki procesor i jak jest zasilany ()? Czy zasilasz z tego inne podzespoły, szczególnie cyfrowe?
Nie daj się ciągnąć za język, trudno zgadywać co Ci nie działa, gdy nie wiemy jak to masz poskładane.
Hehe, to jest tymczasem prototypówka. Dzisiaj podłączę do aku li-on i sprawdzę różnicę. Żadnego procesora, sam układ analogowy i oscyloskop...robiw
Dodano po 6 [godziny] 46 [minuty]:
Tymczasem bawię się czujnikiem z tej strony www.pulsesensor.com. Chyba jednak nie do końca jest sprawny, mimo że nowy. Na wyjściu same śmieci i grzeje się nieco. Wykonam swój i zobaczymy, co z tego wyjdzie... robiw
Tymczasem bawię się czujnikiem z tej strony www.pulsesensor.com. Chyba jednak nie do końca jest sprawny, mimo że nowy.
robiw napisał:
Zaczynam dochodzić do wniosku, że palec mi nie działa
Mnie też palec jakoś kiepsko działa.
Przeglądając Twój wątek, przypomniało mi się że kiedyś ten pulsesensor.com kupiłem od Chińczyka tak właściwie tylko z ciekawości. No i teraz pojawiła się okazja by go przetestować. I powiem tak, czujnik ok, ale mój palec wyraźnie nie jest z nim kompatybilny. Jedynie co udało mi się zobaczyć na oscyloskopie to fala tętna gdzieś 50mVpp ale w pewnych ściśle określonych położeniach. Tak że jak dla mnie, to strasznie mizerny rezultat, właściwie nie warty jakiś dalszych badań.
Wziąłem też do porównania, taki właściwie muzealny czujnik z jakiegoś kardiotachometru, gdzie w obudowie jest żarówka i fotoopornik. Fotoopornik połączyłem tylko opornikiem z plusem 5V, żarówkę do baterii. Czyli żadnych filtrów ani wzmocnienia. Ale co ciekawe zobaczyłem falę tętna nieco tylko mniejszą (rzędu 40mVpp) niż dla pulsesensor.com ale ułożenie czujnika nie było już tak krytyczne, jak w tym drugim. Czyli ten staroć, gdyby tylko wzmocnić i dodać filtrację, mógł by być chyba lepszy niż ten pulsesensor.com.
Podejrzewam że ma tu też znaczenie odległość nadajnika światła od odbiornika, bo w tym pulsesensor.com to ledwo 2mm a w tym starym czujniku 4mm. I może droga światła w moim palcu przechodzi przez mniej naczyń przy tym wąskim odstępie.
Ale zauważyłem że pisałeś coś że próbowałeś na jakiś Maximach.
Akurat miałem moduł z MAX30100 i zapuściłem program testowy do tych kostek z użyciem biblioteki OXullo (taka nazwa się pojawia w opisach).
No i rewelacja. Wykrywał tętno i liczył z mojego palca właściwie bez problemów.
Ponieważ ta biblioteka obrabia żywe dane z czujnika wewnętrznie a udostępnia tylko wyniki liczbowe tętna i saturacji, zmodyfikowałem ją tak by wyciągnąć cyfrowy surowy sygnał która ta biblioteka sczytuje z FIFO czyli prosto z ADC.
Sygnał wygląda tak (kanały czerwony i podczerwony), a wspomnę że to sygnał przed właściwymi filtrami które są zaimplementowane w bibliotece:
Przebiegi te mają dość duże pływanie zera ale to nie istotne ze względu na dalszą filtrację. Dla mnie rewelacją jest ich jakość i amplituda. Dlatego z takich przebiegów biblioteka daje rade policzyć tętno dość niezawodnie.
Co więcej, obróbka tych danych, algorytmy filtrów, wyznaczania tętna itp. zastosowane w bibliotece z którą mam do czynienia są bardzo szeroko i jasno, łącznie z teorią opisane tutaj:
https://morf.lv/implementing-pulse-oximeter-using-max30100
Dlatego jeśli nawet chciałbyś samodzielnie coś podłubać w obróbce danych z czujnika światła, to i tak jako hardware polecałbym któregoś z serii MAX3010x. Tym bardziej że u Chińczyków są moduły z nimi bardzo tanie.
Hej,
Dzięki za obszerną wiadomość. Ja próbowałem z MAX30102 i też nie uzyskałem satysfakcjonujących rezultatów. A jakiego algorytmu używałeś do obliczenia tętna z tych danych? Swoją drogą, jak się dobrze poszuka to wychodzi na to, że tętno znacznie łatwiej znaleźć (dobry sygnał) korzystając z zielonej diody LED (nawet na nadgarstku)...dlatego tymczasem wykonałem układ z Osramowskim SFH7070. Zobaczymy jak będzie tym razem...robiw
A jakiego algorytmu używałeś do obliczenia tętna z tych danych?
Test robiłem z użyciem tej biblioteki i przykładu do niej:
https://os.mbed.com/users/AVELARDEV/code/MAX30100/ Widzę że detekcja tętna jest bardzo podobna ale bardziej rozbudowana niż opisana w tym blogu o którym pisałem nieco wyżej.
Jest to ogólnie detekcją przejścia przez arbitralnie ustawiony próg, ale w tej wersji z mbed (przeportowanej z Arduino), wartość progu się dynamicznie zmienia.
Ale w zasadzie, jak przytoczyłem moje doświadczenie z MAX30100, to nie chodziło mi o obróbkę danych, bo to osobny temat, w który osobiście akurat teraz nie mam czasu ani potrzeby wnikać głębiej, ale o jakość żywych danych uzyskanych prosto z tej kostki (np. w porównaniu z kiepskimi rezultatami moich prób z pulsesensor.com).