ESP32 專題(一) 智慧生醫 – 心率血氧機

七、訊號處理-MAX30100 原始訊號後處理

實際量測心率

我們依照上述提到 PPG 訊號的 AC 分量來計算心率,但感測器給出的原始資料包含 DC、AC 分量,並且其中包含很多雜訊,我們首先要做的是去除 DC 分量,並且使用濾波器將雜訊濾除,圖 22 為實際從感測器讀取出來的紅光原始數值,可以看到原始數值落在 2000~10000 光反射量區間進行震盪。

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 22 紅光原始數值

接著我們透過濾波器將 DC 分量移除,移除的方式很容易,我們透過簡單的 IIR(數位濾波)濾波器,公式如下:

w(t) = x(t) + α·w(t-1)

y(t) = w(t) – w(t-1) 

其中 y(t) 是濾波器的輸出, x(t) 是當前輸入樣本, w(t) 是一個中間值,其作用類似於信號 DC 值的歷史紀錄(上一次的值), α 是一個比例因子(擴大或縮小過濾器)。 如果 α 為 1,則濾波器將濾不到東西,如果為 0 則會濾掉所有東西。 這些值都不是我們想要的,但如果 α 接近 1,它會在直流頻率處創建一個窄阻帶,即濾掉 DC 分量。

對應程式如圖 23,帶入原始數值 x,回傳濾波完剩餘的 AC 分量。

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 23. Arduino IIR 濾波器方法

圖 24 為將 PPG DC 分量去除後的波型,可以發現只剩餘 AC 分量。

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 24. 紅光 PPG AC 分量

接著我們需要進一步將各種雜訊過濾,這裡採用 Stephen Butterworth(巴特沃斯濾波器)濾波器,它能消除更高級別的諧波,我們將在低通濾波器設定中使用巴特沃斯濾波器,也可以說它是帶通濾波器,這裡有一個很方便的網站能幫我們產生巴特沃斯濾波器的常數,圖 25 為我們在此網站的設定方式,我們選擇「巴特沃斯濾波器(Butterworth),低通濾波(Low pass),一階(1st order),階數越高運算量越大,也越能濾掉更高級別的雜訊),採樣率(Fs)根據 MAX30100 設定的採樣率設定為 100Hz,截止頻率(Fc)設為 10Hz,Rn=Fc/Fs=0.1」。

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 25. 巴特沃斯濾波器產生器設定

對應程式如圖 26,帶入原始數值 x,回傳巴特沃斯濾波器濾完的結果。

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 26. Arduino 巴特沃斯濾波器方法

比對圖 27 為 PPG 中 AC 分量尚未經過巴特沃斯濾波器的波型,圖 28 為 PPG 中 AC 分量經過巴特沃斯濾波器的波型,可以發現圖 28 與圖 27 尚未濾波的 PPG AC 分量相比已經乾淨許多,但是尖峰卻相反,那是因為我們將原本的 AC 分量鏡像後再送入巴特沃斯濾波器。

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 27. PPG AC 分量波型
ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 28. PPG AC 分量經過巴特沃斯濾波器波型

八、程式功能

下面列出了此程式的基本功能:

  1. 開機顯示 Icon、相關資訊及版本。
  2. 進入主程式前需檢查各元件狀態。
  3. 透過 TFT 顯示心率、血氧、動態心率柱狀圖、剩餘電量以及充電動態。
  4. 空閒時自動進入「深度睡眠模式」以延長待機時間,並可透過 B 鍵按鈕喚醒。

九、功耗測試

我們希望自製專案品能像市面血氧機一樣透過外部按鈕喚醒,不使用時自動進入省電模式以延長待機時間,由於體積限制的關係,我們採用的電池容量只有 3.7V 500mah,我們希望能盡可能延長待機時間,所以使用了可信度較高的儀器量測了每個使用狀態時的功耗,整機功耗如下所示:

狀態功耗
量測中83 mA
空閒82 mA
深度睡眠390 uA

另外,我們也發現深度睡眠時功耗並不低,經過測量各個元件後結果如下所示:

● TTGO T-Display(實際量測功耗為 300 uA)

元件功耗
ESP32(深度睡眠模式)150 uA
AP2112-3.3(LDO)55 uA
TFT(推測)95 uA

● M5Stack MAX30100 關機功耗(實際量測功耗為 90.4uA)

元件功耗
MAX30100 Chip0.7 uA(依照Datasheet)
HT7533(LDO)2.5 uA(依照Datasheet)
RT9193(LDO)90 uA(依照Datasheet,En=3.3v)

綜合上面結果,可以發現整個 MAX30100 模組都是 RT9193 這顆 LDO 在耗電,因為 EN Pin 固定啟用的關係,若是停用狀態下它的功耗只有 0.01 uA,所以如果想讓整顆 MAX30100 模組降低功耗就必須要從外部控制 RT9193 開與關(必須要自行改電路),若可以自行控制開關 MAX30100 模組關機的整體功耗就可以降為 3.21 uA(0.7+2.5+0.01)。

十、續航力估算

1. 續航力公式

電池續航力 = 電池容量 (mAh) / 負載電流 (mAh)

2. 續航力估算

以電池容量 500mah 為例:

  • 連續使用:預估使用時間(小時):500/83 = 約 6小時。
  • 放著不用:預估使用時間(小時):500/0.39 = 1282 小時,約 53 天。

須注意若放電 C 數超過 0.2,續航力可能就要大打折扣,因為一般的電池容量是以 0.2C 放電下去估算的,本次的最高功耗為 83 mA 並未超過 0.2C(100 mA)。

十一、實際使用

完成上述的組裝與設定後,就讓我們來看看實際使用的狀態吧!

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 29. 開機畫面

將我們自製的心率血氧機與市售的血氧機做比對,可以發現準確度相當地高,是不是瞬間覺得很有成就感呢?

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 30. 與市售血氧機比對結果

十二、小結

以上就是我們這次的 ESP32 專題系列-心率血氧機,我們從硬體、組裝到研究心率血氧量測原理,並且透過多個流程處理讀取到的原始數據,讓數據更加穩定且具有參考價值,最後也研究各個元件的功耗以評估續航力,有機會的話我們會新增其他特殊功能,讓我們的自製血氧機能更符合生活需求,本次的 ESP32 專題分享就到這邊,我們下次見~

參考資料