Daftar Isi:

Pulse Oximeter Dengan Presisi Jauh Lebih Baik: 6 Langkah (dengan Gambar)
Pulse Oximeter Dengan Presisi Jauh Lebih Baik: 6 Langkah (dengan Gambar)

Video: Pulse Oximeter Dengan Presisi Jauh Lebih Baik: 6 Langkah (dengan Gambar)

Video: Pulse Oximeter Dengan Presisi Jauh Lebih Baik: 6 Langkah (dengan Gambar)
Video: 5 Cara Mudah Membedakan Heart Rate Sensor Asli atau Palsu 2024, Juli
Anonim
Pulse Oximeter Dengan Presisi yang Jauh Lebih Baik
Pulse Oximeter Dengan Presisi yang Jauh Lebih Baik
Pulse Oximeter Dengan Presisi yang Jauh Lebih Baik
Pulse Oximeter Dengan Presisi yang Jauh Lebih Baik

Jika Anda baru saja mengunjungi dokter, kemungkinan besar tanda-tanda vital dasar Anda diperiksa oleh perawat. Berat badan, tinggi badan, tekanan darah, serta denyut jantung (HR) dan saturasi oksigen dalam darah tepi (SpO2). Mungkin, dua yang terakhir diperoleh dari probe jari elektronik bercahaya merah yang menampilkan nomor yang relevan di layar kecil dalam hitungan menit. Probe itu disebut oksimeter pulsa dan Anda dapat menemukan semua info dasar tentangnya di sini.

Seseorang dapat dengan mudah membeli oksimeter pulsa sederhana, tentu saja, tetapi di mana kesenangannya? Saya telah memutuskan untuk membangun sendiri, pertama-tama, tetapi yang lebih penting dengan aplikasi spesifik dalam pikiran: oksimetri nokturnal di mana HR dan SpO22 data akan terus dikumpulkan semalaman dan direkam pada kartu micro SD. Instructables sudah berisi beberapa proyek semacam ini, misalnya, dua melibatkan Arduino di sini dan di sini, dan satu menggunakan Raspberry Pi. Milik saya menggunakan sensor MAX30102 yang sedikit lebih baru dari MAXIM Integrated dan Adalogger Feather M0 Adafruit untuk kontrol dan perekaman data.

Dengan demikian, proyek kami tidak terlalu inovatif dalam hal perangkat keras dan karena itu tidak layak untuk menulis Instruksi ini, tetapi dalam proses pembuatannya saya telah membuat kemajuan penting dalam perangkat lunak yang memungkinkan saya untuk mengekstrak data dari MAX30102 dengan konsistensi yang jauh lebih tinggi dan banyak lebih sedikit noise daripada perangkat lunak yang ditulis oleh MAXIM untuk sensor ini. Kinerja algoritma pemrosesan sinyal kami diilustrasikan pada bagan di atas di mana dua grafik teratas berisi detak jantung semalam dan saturasi oksigen yang dihitung dari sinyal mentah dengan metode kami (diidentifikasi dengan "RF"), sedangkan dua grafik bawah menunjukkan hasil MAXIM yang dihasilkan dari sinyal yang sama persis. Standar deviasi untuk HR adalah 4,7 bpm dan 18,1 bpm, dan untuk SpO2 0,9% dan 4,4%, masing-masing untuk RF dan MAXIM.

(Kedua grafik RF sesuai dengan ambang autokorelasi minimal 0,25 dan tidak ada batasan pada korelasi R / IR; lihat Langkah 4 dan 5 untuk penjelasan istilah-istilah ini.)

Langkah 1: Perangkat Keras

Perangkat keras
Perangkat keras
Perangkat keras
Perangkat keras
Perangkat keras
Perangkat keras
Perangkat keras
Perangkat keras
  1. Oksimeter pulsa dan sensor detak jantung MAX30102 board sistem dari MAXIM Integrated, Inc.
  2. Feather M0 Adalogger dari Adafruit, Inc.
  3. Baterai Lithium Ion dari Adafruit, Inc.

Koneksi:

  • Adalogger menyematkan SCL dan SDA ke pin SCL dan SDA yang sesuai pada papan MAX30102
  • Adalogger pin 10 untuk menyematkan INT pada papan MAX30102
  • Adalogger GND ke MAX30102 papan GND
  • Adalogger 3V hingga MAX30102 VIN

Langkah 2: Sinyal Digital Dikembalikan oleh MAX30102

Sinyal Digital Dikembalikan oleh MAX30102
Sinyal Digital Dikembalikan oleh MAX30102
Sinyal Digital Dikembalikan oleh MAX30102
Sinyal Digital Dikembalikan oleh MAX30102

Prinsip operasi sensor sangat sederhana: dua LED, satu merah (660 nm) dan satu inframerah (880 nm, IR) menyinari kulit manusia. Cahaya sebagian diserap oleh jaringan di bawahnya, termasuk darah perifer. Fotodetektor sensor mengumpulkan cahaya yang dipantulkan pada kedua panjang gelombang dan mengembalikan dua intensitas relatif yang sesuai menggunakan protokol I2C. Karena spektrum penyerapan untuk hemoglobin teroksigenasi dan terdeoksigenasi berbeda untuk kedua panjang gelombang, cahaya yang dipantulkan memiliki komponen variabel sebagai jumlah darah arteri yang ada di bawah nadi kulit dengan setiap detak jantung. Mencari tahu detak jantung dan saturasi oksigen terserah perangkat lunak pemrosesan sinyal.

Contoh sinyal mentah (hanya saluran IR) diilustrasikan pada gambar di atas. Seseorang dapat melihat komponen periodik yang dihamparkan pada dasar variabel yang bergeser karena beberapa faktor yang disebutkan di halaman Wikipedia. Artefak yang diinduksi gerakan sangat mengganggu karena dapat menutupi sinyal HR yang berguna dan menyebabkan hasil palsu. Oleh karena itu, oksimeter komersial canggih menampilkan akselerometer yang membantu menghilangkan artefak ini.

Saya dapat menambahkan akselerometer ke versi oksimeter saya berikutnya, tetapi untuk HR/SpO nokturnal2 perekaman, ketika sensor tetap tidak bergerak sebagian besar waktu, cukup untuk mendeteksi dan menghilangkan sinyal yang terdistorsi.

Sensor MAX30102 itu sendiri hadir dalam paket kecil yang dipasang di permukaan, tetapi MAXIM dengan ramah menawarkan papan breakout (System Board 6300) plus perangkat lunak pemrosesan sinyal untuk Arduino dan mbed - semuanya ada dalam paket desain referensi MAXREFDES117#. Saya dengan senang hati membelinya dengan harapan hanya menyolder beberapa kabel antara sensor dan Adalogger dan memiliki oksimeter yang berfungsi baik dalam satu hari. Saya mengadaptasi versi RD117_ARDUINO dari perangkat lunak MAXIM untuk berjalan pada prosesor ARM Cortex M0 Adalogger. Pada dasarnya, yang harus saya lakukan adalah mengganti fungsi SofI2C yang tidak kompatibel di max30102.cpp dengan panggilan pustaka Wire yang sesuai. Kode dikompilasi dengan baik di Arduino IDE v1.8.5 dan berjalan di M0 tanpa kesalahan. Namun, hasil bersihnya mengecewakan. Pada langkah Pendahuluan, saya telah menunjukkan varians HR dan SpO yang sangat tinggi2. Secara alami, orang mungkin mengklaim bahwa saya telah melakukan sesuatu yang salah dan ini adalah pemikiran asli saya juga. Namun, dalam video instruksional MAXIM, Anda juga dapat mengamati nilai HR yang berayun liar yang ditampilkan di layar. Selain itu, komentar di bawah video mengonfirmasi bahwa orang lain juga memperhatikan fenomena serupa.

Singkat cerita, setelah beberapa percobaan saya telah menentukan bahwa sensor beroperasi dengan baik dan metode alternatif pemrosesan sinyal digital menghasilkan stabilitas yang jauh lebih baik. Metode baru ini, ditandai dengan "RF", dijelaskan pada langkah selanjutnya.

Langkah 3: Prapemrosesan Sinyal

Prapemrosesan Sinyal
Prapemrosesan Sinyal
Prapemrosesan Sinyal
Prapemrosesan Sinyal
Prapemrosesan Sinyal
Prapemrosesan Sinyal
Prapemrosesan Sinyal
Prapemrosesan Sinyal

Dalam implementasi kami, sinyal mentah dikumpulkan pada kecepatan 25 Hz (sama dengan MAXIM) selama 4 detik penuh (perangkat lunak MAXIM hanya mengumpulkan nilai 1 detik), menghasilkan 100 titik waktu digital per titik data akhir. Setiap urutan 100 poin harus diproses terlebih dahulu dengan cara berikut:

  1. Mean-centering (alias "penghapusan komponen DC" ke insinyur listrik). Data mentah yang berasal dari sensor adalah deret waktu bilangan bulat dalam 105 jangkauan. Sinyal yang berguna, bagaimanapun, hanya sebagian dari cahaya yang dipantulkan dari darah arteri yang bervariasi pada urutan hanya 102 - sosok pertama. Untuk pemrosesan sinyal yang berarti, oleh karena itu diinginkan untuk mengurangi rata-rata dari setiap titik seri. Bagian ini tidak berbeda dengan apa yang sudah dilakukan oleh software MAXIM. Apa yang berbeda, bagaimanapun, adalah indeks waktu pemusatan rata-rata tambahan itu sendiri. Dengan kata lain, alih-alih mengindeks poin seri dengan angka dari 0 hingga 99, indeks baru sekarang menjadi angka -49.5, -48.5, …, 49,5. Ini mungkin tampak aneh pada awalnya, tetapi berkat prosedur ini "pusat gravitasi" kurva sinyal bertepatan dengan asal sistem koordinat (gambar kedua). Fakta ini menjadi sangat berguna pada langkah selanjutnya.
  2. Perataan dasar. Pandangan lain pada bentuk gelombang yang ditunjukkan pada Langkah 2 menggambarkan bahwa garis dasar sinyal oksimetri nyata jauh dari datar secara horizontal, tetapi bervariasi melalui kemiringan yang berbeda. Gambar ketiga menunjukkan sinyal IR pusat rata-rata (kurva biru) dan garis dasarnya (garis lurus biru). Dalam hal ini, kemiringan garis dasar adalah negatif. Metode pemrosesan sinyal yang dijelaskan di depan membutuhkan garis dasar yang horizontal. Hal ini dapat dicapai dengan hanya mengurangi baseline dari sinyal mean-center. Berkat pemusatan rata-rata dari koordinat Y dan X, intersep garis dasar adalah nol dan persamaan kemiringannya sangat sederhana, seperti yang ditunjukkan pada gambar keempat. Sinyal level dasar ditunjukkan oleh kurva oranye pada gambar ketiga.

Dengan demikian sinyal yang telah diproses sebelumnya siap untuk langkah selanjutnya.

Langkah 4: Pekerja keras: Fungsi Autokorelasi

Pekerja keras: Fungsi Autokorelasi
Pekerja keras: Fungsi Autokorelasi
Pekerja keras: Fungsi Autokorelasi
Pekerja keras: Fungsi Autokorelasi
Pekerja keras: Fungsi Autokorelasi
Pekerja keras: Fungsi Autokorelasi

Kembali ke pengindeksan 1, …, n yang biasa, gambar pertama menunjukkan definisi fungsi autokorelasi rM - kuantitas yang ditemukan sangat berguna dalam mendeteksi periodisitas serta kualitas sinyal. Ini hanyalah produk skalar yang dinormalisasi dari deret waktu sinyal dengan dirinya sendiri digeser oleh lag m. Namun, dalam aplikasi kami, akan lebih mudah untuk menskalakan setiap nilai autokorelasi sehubungan dengan nilainya pada lag = 0, yaitu, menggunakan autokorelasi relatif yang ditentukan oleh rM / R0.

Plot autokorelasi relatif dari sinyal IR berkualitas baik yang khas ditunjukkan pada gambar kedua. Seperti yang diharapkan, nilai pada lag = 0 berada pada maksimum globalnya sama dengan 1. Maksimum (lokal) berikutnya terjadi pada lag = 23 dan sama dengan 0,79. Kehadiran minima dan maksima lokal dalam plot autokorelasi mudah dipahami: ketika sinyal bergeser ke kanan, puncaknya mengganggu secara destruktif satu sama lain pada awalnya, tetapi pada titik tertentu interferensi menjadi konstruktif dan mencapai maksimum pada lag yang sama dengan rata-rata periode sinyal.

Frasa terakhir sangat penting: untuk menentukan periode waktu rata-rata antara puncak, dari mana seseorang dapat menghitung frekuensi sinyal (yaitu, detak jantung) cukup untuk menemukan maksimum lokal pertama dari fungsi autokorelasi! Secara default, MAX30102 mengambil sampel input analog pada kecepatan 25 poin per detik, oleh karena itu pada m yang diberikan periode dalam detik sama dengan m / 25. Ini mengarah ke detak jantung yang dinyatakan dalam denyut per menit (bpm) dengan:

HR = 60*25 / m = 1500 / m

Tentu saja, tidak perlu melakukan perhitungan r. yang mahalM pada semua nilai lag. Algoritme kami membuat tebakan pertama detak jantung = 60 bpm, yang sesuai dengan m = 25. Fungsi autokorelasi dievaluasi pada titik itu dan dibandingkan dengan nilai pada tetangga kirinya, m = 24. Jika nilai tetangga lebih tinggi, maka pawai terus ke kiri sampai rm-1 < rM. Jadi m akhir yang ditentukan kemudian dikembalikan sebagai lag maksimum. Iterasi berikutnya dimulai dari nilai itu alih-alih 25 dan seluruh proses berulang. Jika tetangga kiri pertama lebih rendah, maka barisan rutin di atas menunjukkan lag ke kanan dengan cara yang sama. Sebagian besar waktu, lag maksimal hanya membutuhkan beberapa evaluasi fungsi autokorelasi. Selain itu, kelambatan maksimum dan minimum yang dapat diterima (masing-masing sesuai dengan detak jantung minimal dan maksimal) digunakan sebagai nilai pembatas.

Hal di atas bekerja sangat baik untuk sinyal berkualitas baik, tetapi dunia nyata jauh dari ideal. Beberapa sinyal keluar terdistorsi, sebagian besar karena artefak gerak. Sinyal seperti itu ditunjukkan pada gambar ketiga. Periodisitas yang buruk tercermin dalam bentuk fungsi autokorelasinya serta nilai rendah, 0,28, dari maksimum lokal pertama pada m = 11. Bandingkan dengan nilai maksimum 0,79 yang ditentukan untuk kualitas sinyal yang baik. Seiring dengan nilai pembatas lag, oleh karena itu, nilai rM / R0 maksimum adalah indikator kualitas sinyal yang baik dan persyaratan untuk melebihi ambang batas tertentu dapat digunakan untuk menyaring artefak gerak. Grafik "RF" yang ditunjukkan pada pendahuluan dihasilkan dari ambang batas tersebut sebesar 0,25.

Langkah 5: Menentukan Saturasi Oksigen

Menentukan Saturasi Oksigen
Menentukan Saturasi Oksigen
Menentukan Saturasi Oksigen
Menentukan Saturasi Oksigen
Menentukan Saturasi Oksigen
Menentukan Saturasi Oksigen
Menentukan Saturasi Oksigen
Menentukan Saturasi Oksigen

Langkah sebelumnya sudah cukup untuk menentukan detak jantung. SpO2 membutuhkan lebih banyak pekerjaan. Pertama, sinyal yang diabaikan sejauh ini di saluran merah (R) harus diperhitungkan. Selanjutnya, rasio sinyal merah dan inframerah, Z = R/IR, keduanya dipantulkan dari darah arteri, dihitung. Bagian "darah arteri" sangat penting, karena sebagian besar cahaya sebenarnya dipantulkan dari jaringan dan darah vena. Bagaimana cara memilih bagian dari sinyal yang sesuai dengan darah arteri? Nah, ini dia komponen pulsatile yang bervariasi di setiap detak jantung. Dalam kata-kata insinyur listrik, itu adalah "bagian AC", sedangkan sisa cahaya yang dipantulkan adalah "bagian DC". Karena intensitas absolut cahaya R dan IR tidak sepadan, rasio Z dihitung dari intensitas relatif, seperti yang ditunjukkan pada gambar pertama. Dalam hal jumlah yang benar-benar dihitung, saya menggunakan root-mean-square (RMS) dari mean-center, sinyal level-baseline, y, ke mean yang sudah diketahui dari sinyal mentah, < Y >; lihat gambar kedua. Rasio Z hanya setengah dari pekerjaan, namun. Respon sensor nonlinier memerlukan kalibrasi empiris antara Z dan SpO. akhir2 nilai-nilai. Saya mengambil persamaan kalibrasi dari kode MAXIM:

SpO2 = (-45.06*Z + 30.354)*Z + 94.845

Ingatlah bahwa persamaan ini hanya berlaku untuk papan desain MAX30102 yang dibeli pada tahun 2017! Kemungkinan MAXIM akan mengkalibrasi ulang sensornya di kemudian hari.

Prosedur di atas masih menghasilkan banyak SpO. palsu2 bacaan. Saluran merah menderita banyak artefak, sama seperti saluran IR. Masuk akal untuk mengasumsikan bahwa kedua sinyal harus berkorelasi kuat. Faktanya, sinyal berkualitas baik, seperti contoh pada gambar ketiga, berkorelasi sangat baik. Koefisien korelasi Pearson dalam hal ini setinggi 0,99. Hal ini tidak selalu terjadi, seperti yang diilustrasikan pada gambar keempat. Meskipun sinyal IR akan melewati filter kualitas detak jantung dengan r.-nyaM / R0 = 0,76, sinyal R yang terdistorsi menghasilkan koefisien korelasi yang buruk antara keduanya sama dengan hanya 0,42. Pengamatan ini menawarkan filter kualitas kedua: memiliki koefisien korelasi antara saluran lebih besar dari ambang batas tertentu.

Dua angka terakhir menunjukkan efek bersih dari penyaringan kualitas tersebut. Pertama, saturasi oksigen yang diukur diplot dengan ambang batas kualitas HR 0,25, tetapi tanpa SpO2 Saring. Hasil plot berikutnya dari menyaring SDM dan SpO yang buruk2 hasil pada 0,5 rM / R0 dan 0,8 koefisien korelasi ambang batas. Secara keseluruhan, poin data yang buruk sebesar 12% dari total disaring oleh rezim yang lebih ketat.

Dalam kode kami, koefisien korelasi, cc, dihitung menurut rumus pada gambar kelima, di mana y mewakili sinyal rata-rata yang berpusat pada garis dasar, sedangkan r0 didefinisikan pada langkah sebelumnya.

Langkah 6: Kode Sumber

Kode sumber C untuk proyek ini, diformat untuk Arduino IDE, tersedia dari akun Github kami di tautan berikut:

github.com/aromring/MAX30102_by_RF

Halaman Readme-nya menjelaskan komponen individual.

Saya ingin meluangkan waktu untuk memuji Adafruit karena telah membuat produk yang luar biasa seperti Adalogger berbasis M0. Prosesor ARM Cortex M0 48 MHz yang cepat, dengan banyak RAM, tentu membantu membuat proyek ini layak, sementara pembaca kartu SD yang terpasang langsung (ditambah perpustakaan SD Adafruit) menghilangkan semua kesulitan penghobi yang terkait dengan penyimpanan waktu nyata dari sejumlah besar data.

Direkomendasikan: