Sadržaj:

Pulsni oksimetar sa znatno poboljšanom preciznošću: 6 koraka (sa slikama)
Pulsni oksimetar sa znatno poboljšanom preciznošću: 6 koraka (sa slikama)

Video: Pulsni oksimetar sa znatno poboljšanom preciznošću: 6 koraka (sa slikama)

Video: Pulsni oksimetar sa znatno poboljšanom preciznošću: 6 koraka (sa slikama)
Video: Тест Garmin Forerunner 265 - Forerunner с дисплеем Oled 2024, Novembar
Anonim
Pulsni oksimetar sa znatno poboljšanom preciznošću
Pulsni oksimetar sa znatno poboljšanom preciznošću
Pulsni oksimetar sa znatno poboljšanom preciznošću
Pulsni oksimetar sa znatno poboljšanom preciznošću

Ako ste nedavno posjetili ljekara, velika je vjerovatnoća da je vaše osnovne vitalne znakove pregledala medicinska sestra. Težina, visina, krvni tlak, kao i broj otkucaja srca (HR) i zasićenje kisikom u perifernoj krvi (SpO2). Možda su posljednja dva dobijena iz elektronske sonde sa prstima koja je svijetlila u crvenom i koja je prikazivala relevantne brojeve na malom ekranu u nekoliko minuta. Ta se sonda naziva pulsni oksimetar i ovdje možete pronaći sve osnovne podatke o njoj.

Sigurno se može kupiti jednostavan pulsni oksimetar, ali gdje je tu zabava? Odlučio sam izgraditi vlastiti, prvo za vrag, ali što je još važnije imajući na umu određenu primjenu: noćnu oksimetriju u kojoj i HR i SpO2 podaci bi se kontinuirano prikupljali preko noći i snimali na mikro SD karticu. Instructables već sadrži nekoliko projekata ove vrste, na primjer, dva koja uključuju Arduino ovdje i ovdje, i jedan koji koristi Raspberry Pi. Moj koristi nešto noviji senzor MAX30102 iz integriranog MAXIM -a i Adafruit -ov Mather Adalogger za kontrolu i snimanje podataka.

Naš projekt stoga nije osobito inovativan u hardverskom smislu i kao takav ne bi bio vrijedan pisanja ovog Instructable -a, ali u procesu njegovog stvaranja napravio sam krupan napredak u softveru koji mi je omogućio da izvlačim podatke iz MAX30102 sa mnogo većom dosljednošću i mnogo manje buke od softvera koji je za ovaj senzor napisao MAXIM. Performanse našeg algoritma za obradu signala ilustrirane su na gornjoj tabeli gdje dva gornja grafikona sadrže otkucaje srca i zasićenje kisikom preko noći izračunato iz sirovih signala našom metodom (identificirano s "RF"), dok dva donja grafikona prikazuju MAXIM -ove rezultate dobijene iz potpuno isti signali. Standardne devijacije za HR su 4,7 bpm i 18,1 bpm, a za SpO2 0,9% i 4,4%, za RF i MAXIM, respektivno.

(Oba RF grafikona odgovaraju minimalnom pragu autokorelacije od 0,25 i nema ograničenja u R / IR korelaciji; za objašnjenje ovih termina pogledajte korake 4 i 5.)

Korak 1: Hardver

Hardver
Hardver
Hardver
Hardver
Hardver
Hardver
Hardver
Hardver
  1. Pulsni oksimetar i senzor otkucaja srca MAX30102 matična ploča kompanije MAXIM Integrated, Inc.
  2. Perje M0 Adalogger iz Adafruit, Inc.
  3. Litijum -jonska baterija kompanije Adafruit, Inc.

Veze:

  • Adalogger pinovi SCL i SDA odgovarajućim SCL i SDA pinovima na ploči MAX30102
  • Adalogger pin 10 za pin INT na ploči MAX30102
  • Adalogger GND na ploču GND MAX30102
  • Adalogger 3V na MAX30102 VIN

Korak 2: Digitalne signale vraća MAX30102

Digitalne signale vraća MAX30102
Digitalne signale vraća MAX30102
Digitalne signale vraća MAX30102
Digitalne signale vraća MAX30102

Principi rada senzora su vrlo jednostavni: dvije LED diode, jedna crvena (660 nm) i jedna infracrvena (880 nm, IC) svjetlucaju kroz ljudsku kožu. Svjetlost se djelomično apsorbira u podzemnim tkivima, uključujući perifernu krv. Senzorski fotodetektor prikuplja reflektirano svjetlo na obje valne duljine i vraća dva odgovarajuća relativna intenziteta koristeći I2C protokol. Budući da se spektri apsorpcije oksigeniranog i deoksigeniranog hemoglobina razlikuju za obje valne duljine, reflektirano svjetlo ima promjenjivu komponentu kao količinu arterijske krvi koja je prisutna pod kožnim pulsom pri svakom otkucaju srca. Određivanje brzine otkucaja srca i zasićenja kisikom ovisi o softveru za obradu signala.

Primjeri sirovih signala (samo IC kanal) ilustrirani su na gornjim slikama. Može se primijetiti periodična komponenta prekrivena na promjenjivoj osnovnoj liniji koja se mijenja zbog više faktora spomenutih na stranici Wikipedia. Artefakti izazvani kretanjem posebno su neugodni jer mogu prikriti korisni HR signal i uzrokovati lažne rezultate. Stoga napredni komercijalni oksimetri imaju akcelerometre koji pomažu u poništavanju ovih artefakata.

U sljedeću verziju svog oksimetra mogu dodati akcelerometar, ali za noćni HR/SpO2 snimanje, kada senzor većinu vremena ostaje nepomičan, dovoljno je otkriti i izostaviti izobličene signale.

Senzor MAX30102 sam dolazi u malom površinski montiranom pakovanju, ali MAXIM ljubazno nudi ploču za razbijanje (sistemska ploča 6300) plus softver za obradu signala za Arduino i mbed - sve u referentnom dizajnerskom paketu MAXREFDES117#. Sretno sam ga kupio očekujući da ću samo zalemiti neke žice između senzora i Adaloggera i imati ispravan, dobar oksimetar u jednom danu. Prilagodio sam RD117_ARDUINO verziju MAXIM -ovog softvera za rad na Adalogger -ovom ARM Cortex M0 procesoru. U osnovi, sve što sam trebao učiniti je zamijeniti nekompatibilne funkcije SofI2C u max30102.cpp odgovarajućim pozivima biblioteke Wire. Kod je dobro sastavljen u Arduino IDE v1.8.5 i radio je na M0 bez ikakvih grešaka. Neto rezultati su, međutim, bili razočaravajući. U uvodnom koraku već sam pokazao vrlo veliku varijaciju HR i SpO2. Naravno, može se tvrditi da sam učinio nešto loše i to je bila i moja prvotna misao. Međutim, u videu MAXIM -ovog uputstva možete vidjeti i divlje ljuljanje HR vrijednosti prikazanih na ekranu. Štoviše, komentari ispod videa potvrđuju da su i drugi primijetili sličnu pojavu.

Da skratim priču, nakon nekog eksperimentiranja utvrdio sam da senzor radi u redu i da alternativna metoda digitalne obrade signala rezultira mnogo boljom stabilnošću. Ova nova metoda, označena sa "RF", opisana je u sljedećim koracima.

Korak 3: Predprocesiranje signala

Predprocesiranje signala
Predprocesiranje signala
Predprocesiranje signala
Predprocesiranje signala
Predprocesiranje signala
Predprocesiranje signala
Predprocesiranje signala
Predprocesiranje signala

U našoj implementaciji, sirovi signal se prikuplja brzinom od 25 Hz (isto kao i MAXIM -ov) pune 4 sekunde (MAXIM -ov softver prikuplja samo 1 sekundu), što rezultira sa 100 digitalizovanih vremenskih tačaka po krajnjoj tački podataka. Svaki niz od 100 točaka mora se prethodno obraditi na sljedeći način:

  1. Središnje centriranje (tzv. "Uklanjanje istosmjerne komponente" elektroinženjerima). Sirovi podaci koji dolaze sa senzora vremenski su niz cijelih brojeva u 105 raspon. Korisni signal je, međutim, samo dio svjetlosti reflektiran od arterijske krvi koji varira samo 102 - prva cifra. Zbog smislene obrade signala, stoga je poželjno oduzeti srednju vrijednost od svake tačke serije. Ovaj dio se ne razlikuje od onoga što već radi softver MAXIM. Ono što je različito, međutim, je dodatno centriranje samih vremenskih indeksa. Drugim riječima, umjesto indeksiranja serijskih bodova brojevima od 0 do 99, novi indeksi sada su brojevi -49,5, -48,5, …, 49,5. U početku može izgledati čudno, ali zahvaljujući ovoj proceduri "težište" krivulje signala podudara se s ishodištem koordinatnog sistema (druga slika). Ova činjenica postaje vrlo korisna u sljedećem koraku.
  2. Poravnanje osnove. Drugi pogled na valne oblike prikazane u koraku 2 ilustrira da osnovna linija realnih oksimetrijskih signala daleko od toga da je horizontalno ravna, ali varira kroz različite nagibe. Treća slika prikazuje infracrveni IR signal (plava krivulja) i njegovu osnovnu liniju (plava ravna linija). U ovom slučaju, nagib osnovne linije je negativan. Gore opisana metoda obrade signala zahtijeva da osnovna linija bude vodoravna. To se može postići jednostavnim oduzimanjem osnovne linije od signala usmjerenog na sredinu. Zahvaljujući srednjem centriranju koordinata Y i X, presjek osnovne linije je nula, a jednadžba nagiba je posebno jednostavna, kao što je prikazano na četvrtoj slici. Signal niveliran osnovnom linijom prikazan je narančastom krivuljom na trećoj slici.

Tako unaprijed obrađen signal spreman je za sljedeći korak.

Korak 4: Radni konj: funkcija autokorelacije

Radni konj: funkcija autokorelacije
Radni konj: funkcija autokorelacije
Radni konj: funkcija autokorelacije
Radni konj: funkcija autokorelacije
Radni konj: funkcija autokorelacije
Radni konj: funkcija autokorelacije

Vraćajući se na uobičajeno indeksiranje 1,…, n, prva slika prikazuje definiciju funkcije autokorelacije rm - količina za koju se utvrdilo da je vrlo korisna u otkrivanju periodičnosti i kvaliteta signala. To je jednostavno normalizirani skalarni proizvod vremenske serije signala sa samim pomakom za lag m. U našoj je aplikaciji, međutim, prikladno skalirati svaku vrijednost autokorelacije s obzirom na njezinu vrijednost pri lag = 0, tj. Koristiti relativnu autokorelaciju definiranu s rm / r0.

Grafikon relativne autokorelacije tipičnog IC signala dobre kvalitete prikazan je na drugoj slici. Očekivano, njegova vrijednost pri zaostajanju = 0 je na globalnom maksimumu jednakom 1. Sljedeći (lokalni) maksimum se javlja pri zaostajanju = 23 i jednak je 0,79. Prisustvo lokalnih minimuma i maksimuma u grafikonu autokorelacije lako je razumljivo: kako se signal pomiče udesno, njegovi vrhovi isprva destruktivno ometaju jedan drugog, ali u određenom trenutku smetnje postaju konstruktivne i postižu maksimum pri zaostajanju jednakom prosjeku period signala.

Posljednja fraza je ključna: da bi se odredio prosječni vremenski period između vrhova, iz kojeg se može izračunati frekvencija signala (tj. Broj otkucaja srca), dovoljno je pronaći prvi lokalni maksimum funkcije autokorelacije! Prema zadanim postavkama, MAX30102 uzorkuje analogni ulaz brzinom od 25 točaka u sekundi, stoga je na zadanom m period u sekundama jednak m / 25. To dovodi do otkucaja srca izraženih u otkucajima u minuti (bpm) sa:

HR = 60*25 / m = 1500 / m

Naravno, nije potrebno raditi skupe proračune rm pri svim zaostalim vrijednostima. Naš algoritam daje prvo pogađanje otkucaja srca = 60 otkucaja u minuti, što odgovara m = 25. Funkcija autokorelacije se procjenjuje u tom trenutku i uspoređuje s vrijednošću na njenom lijevom susjedu, m = 24. Ako je vrijednost susjeda veća, tada marš se nastavlja lijevo do rm-1 <rm. Tako određeno konačno m tada se vraća kao zaostatak na maksimumu. Sljedeća iteracija počinje od te vrijednosti umjesto 25 i cijeli se proces ponavlja. Ako je prvi lijevi susjed niži, tada gornji rutinski marševi kašnjenja pokazuju na desno na sličan način. Većinu vremena maksimalno kašnjenje zahtijeva samo nekoliko procjena funkcije autokorelacije. Osim toga, maksimalni i minimalni prihvatljivi zaostaci (koji odgovaraju minimalnom i maksimalnom pulsu, respektivno) koriste se kao granične vrijednosti.

Gore navedeno radi vrlo dobro za kvalitetne signale, ali stvarni svijet je daleko od idealnog. Neki signali izlaze izobličeni, uglavnom zbog artefakata kretanja. Takav signal prikazan je na trećoj slici. Loša periodičnost odražava se u obliku funkcije autokorelacije, kao i u niskoj vrijednosti, 0,28, prvog lokalnog maksimuma pri m = 11. Uporedite je s maksimalnom vrijednošću od 0,79 utvrđenom za signal dobre kvalitete. Uz granične vrijednosti kašnjenja, stoga je i vrijednost rm / r0 maksimalno je dobar pokazatelj kvalitete signala, a zahtjev za prelaskom određenog praga može se koristiti za filtriranje artefakata pokreta. Grafikoni "RF" prikazani u uvodima rezultat su takvog praga jednakog 0,25.

Korak 5: Određivanje zasićenja kisikom

Određivanje zasićenja kisikom
Određivanje zasićenja kisikom
Određivanje zasićenja kisikom
Određivanje zasićenja kisikom
Određivanje zasićenja kisikom
Određivanje zasićenja kisikom
Određivanje zasićenja kisikom
Određivanje zasićenja kisikom

Prethodni korak bio je dovoljan za određivanje brzine otkucaja srca. SpO2 zahteva više posla. Prvo se mora uzeti u obzir do sada zanemareni signal u crvenom (R) kanalu. Zatim se izračunava omjer crvenih i infracrvenih signala, Z = R/IR, oba reflektirana od arterijske krvi. Dio "arterijske krvi" je ključan, jer se većina svjetla zapravo reflektira od tkiva i venske krvi. Kako odabrati dio signala koji odgovara arterijskoj krvi? Pa, ovo je pulsirajuća komponenta koja varira sa svakim otkucajem srca. Prema riječima elektrotehničara, to je "AC dio", dok je preostalo reflektirano svjetlo "DC dio". Budući da apsolutni intenziteti R i IR svjetlosti nisu proporcionalni, Z omjer se izračunava iz relativnih intenziteta, kao što je prikazano na prvoj slici. U smislu stvarno izračunatih veličina, koristim korijen-srednji kvadrat (RMS) srednje centriranog signala, niveliranog na bazi, y, do već poznate srednje vrijednosti neobrađenog signala, <Y>; vidi drugu sliku. Međutim, omjer Z je samo polovica posla. Odziv nelinearnog senzora zahtijeva empirijsku kalibraciju između Z i konačnog SpO2 vrijednosti. Uzeo sam kalibracionu jednačinu iz MAXIM koda:

SpO2 = (-45,06*Z + 30,354)*Z + 94,845

Imajte na umu da ova jednadžba vrijedi samo za dizajnerske ploče MAX30102 kupljene 2017. godine! Vrlo je vjerojatno da će MAXIM kasnije ponovno kalibrirati svoje senzore.

Gore navedeni postupak i dalje proizvodi mnogo lažnih SpO2 čitanja. Crveni kanal pati od mnogih artefakata, baš kao i IC. Razumno je pretpostaviti da bi oba signala trebala biti snažno povezana. Zapravo, signali dobre kvalitete, poput primjera na trećoj slici, jako dobro koreliraju. Pearsonov koeficijent korelacije je u ovom slučaju čak 0,99. To nije uvijek slučaj, kao što je prikazano na četvrtoj slici. Iako bi IC signal prošao kroz filter kvalitete otkucaja srca sa svojim rm / r0 = 0,76, iskrivljeni R signal rezultira lošim koeficijentom korelacije između njih jednakim samo 0,42. Ovo opažanje nudi drugi filter kvalitete: koji ima koeficijent korelacije između kanala veći od određenog praga.

Posljednje dvije brojke ilustriraju neto učinak filtriranja takve kvalitete. Prvo, izmjereno zasićenje kisikom iscrtano je s pragom kvalitete HR od 0,25, ali bez SpO2 filter. Sljedeći grafikon rezultat je filtriranja lošeg HR -a i SpO -a2 rezultati na 0,5 rm / r0 i 0,8 pragova koeficijenta korelacije. Sve u svemu, loši podaci sa 12% ukupnog iznosa filtrirani su po strožem režimu.

U našem kodu koeficijent korelacije, cc, izračunat je prema formuli na petoj slici, gdje y predstavlja srednje centrirani signal, niveliran na osnovnoj liniji, dok r0 definirano je u prethodnom koraku.

Korak 6: Izvorni kod

C izvorni kod za ovaj projekt, formatiran za Arduino IDE, dostupan je s našeg Github računa na sljedećoj poveznici:

github.com/aromring/MAX30102_by_RF

Njegova stranica Readme opisuje pojedinačne komponente.

Htio bih uzeti trenutak da pohvalim Adafruit za izradu tako izvrsnog proizvoda kao što je Adalogger na bazi M0. Njegov brzi ARM Cortex M0 procesor od 48 MHz, s puno RAM -a, zasigurno je pomogao da ovaj projekt postane održiv, dok je izravno priključeni čitač SD kartica (plus Adafruitova SD biblioteka) uklonio sve hobističke bolove povezane sa pohranjivanjem velikih količina podataka u stvarnom vremenu.

Preporučuje se: