概述
健身追蹤器和智慧手錶等穿戴式裝置通常採用光學感測器來測量佩戴者的生命徵象。透過光體積變化描記圖(Photoplethysmography,PPG)技術,這些感測器會產生與受試者皮膚組織內血流和體積變化相對應的訊號。此 PPG 訊號必須經過不同程度的處理,才能獲得心率、呼吸頻率、血氧飽和度甚至血壓等生命徵象的合理估計。由於心率是其中最容易取得的,因此下面介紹的項目示範了使用光學感測器導出該值的簡單方法。
儘管這種方法並不複雜,但它確實需要權衡。它所採用的濾波運算的計算量非常大,每個傳入的資料樣本都需要近一百個乘法指令。在許多 MCU 上實現此演算法將具有挑戰性,並且可能需要進一步的權衡(例如,降低取樣率)。然而,NXP 的 MCX N94 MCU 具有整合的 DSP 加速器,使演算法能夠快速執行,並為嵌入式設計人員提供更大的靈活性。繼續閱讀有關為此項目選擇的硬體的更多詳細資訊以及定義應用程式的韌體的概述。
硬體
圖 1 顯示了正在運行的項目。顯然,它由三個要素組成:
- MCU 開發板(FRDM-MCXN947)
- 感測器子板(HEART RATE 10 CLICK)
- LCD 子板(LCD-PAR-S035)
圖 1:使用者利用演示項目獲取心率資料
FRDM-MCXN947
此專案的基礎是 FRDM-MCXN947 開發板,該開發板採用 MCX N94x 系列 MCU。FRDM 平台是一種低成本的評估選項,優先考慮具有眾多接頭的 I/O 訪問,並提供基本的原型設計功能,例如按鈕、LED 和外部閃存。FRDM-MCXN947 甚至包括 CAN 連接器、乙太網路連接器、溫度感測器和觸控板。支援標準 Arduino、mikroBUS 和 Pmod 外形尺寸;還包括相機和 LCD 接頭。 SmartDMA/相機接頭與 CAMERA-OV7670 等相機模組相容,FlexIO/LCD 接頭與 LCD-PAR-S035 等顯示器相容。
此專案利用 mikroBUS 和 LCD 接頭連接器與使用者互動。HEART RATE 10 CLICK 板插入 mikroBUS 插座以從使用者手指收集 PPG 數據,LCD-PAR-S035 顯示器用於呈現自訂圖形使用者介面(GUI),其中顯示後處理的 PPG 資料作為即時圖表。
光學感測器
PPG 感測器的基本工作原理很簡單:光線從 LED 發射到皮膚組織中,其中一部分被循環血液吸收。透過光電探測器測量離開組織的光的強度(透過反射或透射),從而可以觀察其強度隨時間的變化。這種變化對應於心動週期不同階段血流量的變化。
根據應用(例如,正在測量哪些生命徵象、光電探測器相對於光源的位置、物體的活動水平),可以使用不同波長的光。光的波長越長,穿透組織的深度就越深。例如,波長為 470nm 的光(即藍光)只能到達毛細血管所在的表皮。570nm 的波長(即綠光)可以更深入地到達包含小動脈的真皮層。為了到達皮下組織中的動脈,需要 640nm 至 940nm 的波長(即紅光和紅外光)。許多 PPG 感測器利用多個 LED,這些 LED 可以按順序快速打開和關閉,以獲得多個通道的數據。圖 2 提供了對此的簡化說明,其中反射型感測器使用四個 LED 來收集人類指尖不同深度的數據。
圖2:
Analog Devices 的 MAX86916 光學感測器專為可穿戴和行動裝置而設計。其 3.5mm x 7.0mm x 1.5mm 封裝中整合了四個 LED(紅外線、紅色、綠色和藍色);光電二極體;用於環境光消除、串擾消除和一些數位濾波的低雜訊電路。透過允許主機配置使用哪些 LED、它們的排序順序、每個 LED 的強度及其脈衝寬度,可以實現最大的靈活性。內部 ADC 具有 19bit 分辨率,可程式資料速率高達每秒 3200 個取樣(samples per second)。資料儲存在 32 個取樣深度 FIFO 中,直到主機處理器準備好透過 I2C 匯流排檢索資料。
MikroElectronika 提供 Heart Rate 10 Click 擴充板,作為與 MAX86916 感測器輕鬆連接的一種方式。除了感測器本身;它包括一個 1.8V LDO、一個用於 I2C 總線的電壓位準轉換器以及一個用於中斷訊號的上拉電阻。該板透過 mikroBUS 插座連接到 FRDM-MCXN947 板,以建立與 MCU 的連接。
MCX N947
NXP 的 MCX N 系列 MCU 主要針對需要高運算效能和低功耗的應用。雙 ARM Cortex-M33 核心、協處理器、加速器和智慧型週邊設備等可用功能可促進快速、自主和平行操作。從而可以大幅減少延遲和功耗。MCX N94x 是該系列中的最高級別產品,包括圖 3 中框圖所總結的所有上述功能。
圖 3:NXP 的 MCX N94x MCU 框圖
這個專案特別感興趣的是加速器部分的模組之一:PowerQuad DSP 協處理器和加速器。此週邊設備旨在協助 Cortex-M33 執行常見的數位訊號處理(DSP)任務。其框圖如圖 4 所示;它包含多個能夠進行 FIR 濾波(即卷積)、FFT/IFFT 運算、矩陣運算(例如乘法、反向、點積、縮放)、雙二階 IIR 濾波、三角函數、超越函數和 CORDIC 的計算引擎(即用於反三角函數)的 Volder 演算法。
圖 4:
每個 PowerQuad 引擎都使用部分或全部四個浮點乘法累加器(MAC)區塊,從而能夠並行執行計算。例如,FIR 過濾引擎可以並行運行四個 MAC 運算,這顯著加快了底層卷積運算的速度。更快的捲積意味著更快的濾波,這又意味著 a) MCU 可以在低功耗狀態下花費更多時間,或者 b) 訊號處理鏈可以變得更強大。
對於這個簡單的專案來說,功耗並不重要,因此我們選擇選項 (b),並使用 PowerQuad 使用大型 99 抽頭 FIR 高通濾波器 (HPF) 對四個 PPG 資料通道中的每一個進行濾波。這樣做時,直流偏移和基線漂移將被消除,所得訊號將以零為中心。雖然可以使用計算成本較低的濾波方法來實現這種效果,但它會導致 PPG 波形顯著變形。雖然這對於簡單的心率檢測來說不一定是問題,但我們確實希望 LCD 顯示器上繪製的 PPG 數據能夠準確地揭示與心臟活動相關的特徵。
注意:雖然增加更多抽頭確實可以提高濾波器效能,但除了增加運算時間之外,它確實還有另一個缺點。 FIR 濾波器的群組延遲是濾波器階數 (\frac{N-1}{2}) 的一半,這意味著隨著濾波器係數數量的增加,輸出訊號中引入的延遲也會增加。因此,我們採用的 99 抽頭濾波器將 PPG 訊號延遲 49 個取樣。雖然這對我們的專案來說很好,但由應用程式設計者決定其特定係統可以接受多少延遲。
韌體
該應用程式的 MCUXpresso 專案可以在其 GitHub 儲存庫中找到。找到實現資料收集、資料處理和 GUI 控制的高階應用程式程式碼;導覽至 source/lvgl_guider.c
檔案中的 PpgTask()
函數。
PPG 資料收集和處理
在從 MAX86916 光學感測器收集資料之前,必須先透過 I2C 匯流排修改其內部暫存器來對其進行配置。這樣做很簡單,並且寄存器在設備的資料表中有詳細記錄。對於此應用,該設備配置為依序點亮四個 LED 中的每一個,並測量每個 LED 的反射光強度,從而產生四個通道的 PPG 數據。取樣率設定為 800sps,「樣本平均」設定為 16。一旦其中 17 個樣本寫入 FIFO,中斷訊號將透過中斷引腳傳送到 MCU。感測器的接近功能也被啟用。
啟用接近功能後,IR LED 將充當接近偵測器的雙重用途,以確定物體是否靠近感測器。只有當物體距離感測器夠近時才會進入資料擷取模式。在這種情況下,使用者將手指放在感測器上將觸發 LED 排序操作並在 FIFO 中累積樣本資料。 MCU 將透過中斷引腳定期收到訊號,以便在 FIFO 變滿之前從 FIFO 讀取資料。如果物體遠離感測器,它將自動退出資料擷取模式以降低功耗。
當 MCU 從感測器的 FIFO 讀取樣本資料窗口,就會在 PowerQuad DSP 協處理器的幫助下對其進行高通濾波,如上一節所述。這樣做的結果如下圖所示。請注意,原始波形(黑色)具有較高的直流偏移,且訊號的基線會隨著時間的推移而漂移。透過衰減這些低頻成分並允許高頻成分不受影響,我們得到以紅色顯示的以零為中心的波形。另請注意,濾波後的 PPG 訊號的形狀並未明顯失真。
圖 5:對從感測器取得的 PPG 資料進行高通濾波的範例。
當收集並過濾了足夠的樣本,它們就可以用來估計使用者的心率。儘管有許多複雜的方法和演算法可用於此目的,但為了簡單起見,該專案採用了非常簡單的方法。它的工作原理是檢測負零交叉並為其添加時間戳,作為索引個體心跳的一種手段。然後,可以透過對後續心跳之間的時間跨度進行平均並將此「每心跳取樣數」測量值轉換為「每分鐘心跳數」之一來輕鬆得出心率估計值。
圖形使用者介面
LCD 子板用於顯示簡單的 GUI,向使用者顯示最新過濾的 PPG 資料以及估計的心率值。它是使用 NXP 的 GUI Guider 工具設計的,該工具提供了一個拖放編輯器,用於放置和配置圖表、進度條、標籤和圖像等小部件。圖 6 中的螢幕截圖顯示了該項目使用了哪些小部件以及它們的佈局方式。 GUI 設計完成後,此工具可用於產生要在 MCUXpresso 專案中實作的 C 程式碼。
圖 6:用於設計此專案 GUI 的 NXP GUI Guider 工具的螢幕截圖。
該工具使用開源 LVGL 圖形庫來實現 GUI 元素,應用程式程式碼使用其高級介面來控制 GUI 的行為並更新要顯示的資料。這包括使用最新的 PPG 資料更新圖表元素、使用最新匯出的估計更新心率標籤,以及觸發各種動畫以提供不同應用程式狀態之間的平滑過渡。事實上,由於 GUI Guider 產生的 ui_animation()
函數,動畫編碼變得更加簡單。有了它,該應用程式中的每個動畫只需一行程式碼即可實現。
如前所述,一旦使用者將手指放在光學感測器上,此應用程式就會觸發數據採集。當 MCU 收集初始取樣時,進度條將按比例填充,直到超過濾波器的群延遲。一旦完全填滿,進度條淡出,標籤/圖像淡入。角落的心臟圖像都會週期性地“跳動”,並帶有放大/縮小動畫。
一旦使用者移開手指並且光學感測器退出資料擷取模式,GUI 更新和動畫就會凍結。更換手指會導致 GUI 重設並從頭開始。