2023年2月11日

脈搏感應器PPG的應用(7):脈搏的波形如何用來判斷血管硬化程度?

這陣子用脈博感測器偵測到的不同人的脈搏波,可以看到不同的樣子,大致上有一個振幅比較大的波,後面伴隨著第二個波









使用 PPG測量時,其交流成份來自動脈中血液體積的變化,其他如皮膚、骨骼、肌肉、靜脈血等並沒有交流成份(意思就是都不會變)。產生的波形的特徵點如下:兩個高峰為 Systolic Peak和 Diastolic Peak,兩峰之中的小山谷為 Dicrotic Notch

來源:Photoplethysmogram Analysis and Applications: An Integrative Review



脈搏波是數個波的疊加,由下圖可看見三個主要波
第一個是主波峰(Percussion wave):心室收縮時血液造成的最大振幅波,此波上升速度受心輸出量、心室射血速度、動脈阻力和管壁彈性影響

第二個是潮波(Tidal wave):是動脈內血液流動的逆向反射波,例如進入小動脈時的反射波,此波受外週血管阻力、血管彈性程度影響。

第三個波是重搏波(Dicrotic wave):射血之後主動脈瓣突然閉合,於是血液逆流撞擊到主動脈上,並回彈導致主動脈壓再度上升所形成的波,受到血管彈性與主動脈瓣關閉狀態影響較大。

資料來源:脈波信號與PPG信號特徵之相關性研究 
圖片來源:Blood Pressure Estimation by Photoplethysmogram Decomposition into Hyperbolic Secant Waves https://www.mdpi.com/2076-3417/12/4/1798


反射波是怎麼產生的?在上面這個網站上有示意圖動畫,看了就可以了解。當血管彈性越差(血管硬化),反射波會越大。就想像把球丟到硬地板和軟地板的差別,越硬彈的越高。


因此透過動脈波形的型態,可以用來推測心臟與血管的狀態。


觀察PPG的波形特徵點,下圖為血壓波,雖測量的物理量不同,但波形類似可以參考比較,最低點和最高點分別為舒張壓和收縮壓,而 PPG可為血液體積的最大量與最低量。第一高峰的範圍為心室收縮期,第二高峰為舒張期。因此第一高峰的起爬點為動脈瓣開啟時,Dicrotic Notch為瓣膜關閉時。

圖片來源:https://www.statpearls.com/ArticleLibrary/viewarticle/17843



利用波形分析血管的方式是以PPG作一次微分後得到VPG(velocity of PPG),再做一次微分得到APG (acceleration plethysmogram) 。不同的波形可以得到不同的特徵點,例如下圖VPG的W、X、Y、Z,或是APG的a、b、c、d、e。



兩張圖來源為《Toward Generating More Diagnostic Features from Photoplethysmogram Waveforms

以APG的波形來看,可以分成七種不同型態
圖片來源:On the Analysis of Fingertip Photoplethysmogram Signals




APG波形的型態與血管硬化程度有關。下圖的七個型態中的黑色虛線箭頭即為APG波形的特徵點b與d的連線,年齡越大,血管越硬化,箭頭會朝向右下。(可以理解成第一種型態就是血管很會彈,到第七種就是彈不太動了)




某些動脈硬化檢查儀即是量測這些波形上的特徵點數值再做運算,從而給出血管檢測的數值。例如此種機器的報告,左方顯示APG波形,根據特徵點判斷屬於哪類型波形,而右方給出了幾個數據如EC、AE、RBV,有些還有DPI的數值


這些數據的意義如下,評估心臟和血管的功能
DPI-Diferential Pulse Wave Index:血管老化評估
EC-Eccentric Constriction:心室功能評估
AE-Arterial Elasticity:血管結構評估
RBV-Remaining Blood Volume:血量配置評估

在這個機器SA3000P的使用簡報中,給出了數值計算的公式,是用那些特徵點的數據去運算。




2023年2月9日

脈搏感應器PPG的應用(6):心率變異性的頻域分析與pythnon程式影片說明

心率變異性做頻域的分析,其中一個目的就是在評估自律神經的功能,而頻域分析最重要的工具就是使用FFT。

而使用FFT做頻域分析有幾個限制:

(1)數據點需要相同取樣頻率。

假設每秒取樣一次,代表要知道該秒時,心跳的BPM是多少,但實際上不可能知道每秒時的BPM,因為你那秒不一定有心跳啊。所以這部分要進行interpolate插值,然後再重新取樣(resampling)

那麼應該重新取樣成多少數據點呢?牽涉到FFT的下一個限制

(2)在FFT的演算法中,需要用二的冪次個數據點來運算才會最有效率,如果超過要刪除,不夠的話就補零。(二的冪次如2、4、8、...)

我看了幾篇論文都是用 7.11 Hz來重新取樣(google 7.11Hz HRV),我推測原因是這樣:每個量測時間段約5分鐘(300秒),取288 秒,用7.11Hz重新取樣,則可以得到 7.11 x 288 = 2047.68個數據點,至少有 2048個數據點可以做FFT。使用 7.11 Hz的取樣頻率,則Nyquist frequency為 7.11/2 =  3.55 Hz,能表示的頻率範圍為 0 ~ 3.55 Hz。
數據長度為2048,而FFT之後信號在頻域的表現是對稱的,所以只取一半。總頻帶是 0 ~ 3.55Hz,中間分布 2048/2=1024個點,所以每個bins的頻率是 3.55/1024 = 0.00346679687 Hz

這個指引中,HRV的頻域分析上,會分成四個頻段來分析,而在這篇【An Overview of Heart Rate Variability Metrics and Norms】說明了不同頻段的研究限制和意義。

以下是我的某次測量的分析結果圖,分成了三個區塊。由左至右為VLF、LF、HF




ULF 頻段 (ultra low frequency,≤0.003 Hz) 
  • 週期為 5 分鐘至 24 小時,要用 24 小時記錄來測量,無法用5分鐘的短期測量來觀察。影響這個頻段的可能包含晝夜節律、核心體溫變化、新陳代謝和腎素-血管緊張素系統。
VLF 頻段  (very low frequency,0.0033–0.04 Hz) 
  • 周期在 25 到 300 秒之間。需要至少 5 分鐘的記錄時間,但最好在 24 小時內進行監控。此頻段可能受到身體活動 、體溫調節、腎素-血管緊張素和內皮對心臟的影響,另外副交感神經的活動可能有助於 VLF 功率。
LF  頻段(low frequency,0.04–0.15 Hz) 
  • 代表自律神經(交感+副交感)的活性
  • 周期為 7 至 25 秒的節奏組成,會受每分鐘 ~3 至 9 次的呼吸頻率影響 。在 5 分鐘內有 12-45 個完整的振盪週期 。此頻段主要反映休息狀態的壓力感受器活動。此頻段的功率可能由交感和副交感產生。
  • 血壓調節的方式是藉由感壓受器,主要由副交感神經或單獨通過壓力反射而活動。
  • 交感神經似乎不會產生遠高於 0.1 Hz的頻率,而副交感神經會影響低至 0.05  Hz(20 秒節律)的心律。
  • 在休息狀態下,LF 頻段反映出壓力反射活動不是受交感神經支配。
HF 頻段 (high frequency,0.15–0.40 Hz) 
  • 代表副交感的活性
  • 受 9 至 24 bpm 的呼吸影響 
低頻與高頻功率之比(LF/HF ratio)
  • 可以估計交感神經系統和副交感神經系統活動之間的比率。
  • 交感和副交感的活動都對 LF 功率有貢獻,而副交感則主要對 HF 功率有貢獻。
  • 有些研究會將此比當作交感與副交感的活動比例,但因為LF的功率同時包含交感和副交感,所以這點有爭議。

這篇也同時提到幾點
  • 副交感神經發揮作用比交感神經(>5 秒)更快(<1 秒)
  • 短期測量的HRV受到以下幾個因素影響:1.交感神經和副交感神經的交互影響,2.RSA(呼吸性竇性心律不整)控制心跳的調節機制、壓力感受器反射(血壓的負反饋控制)和血管張力的節律變化 。
  • 交感神經可以抑制副交感神經活動,但也可能增加副交感神經的反應。
  • 交感和副交感的關係並不像翹翹板那樣一個高一個就低。副交感的活動增加可能與交感的活動減少、增加或無變化有關
程式分析的方式
最後終於講到分析方式

在Kaggle上,有一篇是利用python對 ECG進行分析的文章

我參考這篇文章和前述的文獻,改寫了程式碼。
整個分析程序分以下幾個部分
  1. micro:bit 的程式只負責讀取類比pin,然後印出。要注意指定傳輸速度為 115200


  2. 先用這個python的程式去讀取micro:bit的資料,並加上以微秒為單位的時間戳記,並存檔。此程式也同時展示脈搏波形PPG與BPM變化


  3. 使用另外一個python程式(用jupter notebook),先讀取方才存檔的文字檔後,前段程式負責劃出段測量時間的脈搏圖,使用者須自行看圖,藉此用來決定用哪一段時間來進行分析。因為通常開頭會有雜訊,而結尾會有一些資料無法讀取。
  4. 偵測峰值之後,會在脈搏的PPG上標示峰值點,可藉此判斷是否都標示出正確峰值。如果這部分有異常,將影響後面的時域分析和頻域分析。


  5. 確認峰值沒錯之後,直接執行後半的程式,即可產出分析的結果報告。圖上同時會有時域分析、頻域分析、非線性分析、幾何分析等結果。
分析結果圖片

HRV變化圖
灰色水平線為平均HR,兩條紅線為標準差。多數都位於一個標準差內

龐加萊圖Poincaré plot
也稱為Lorenz (Poincaré) plots (LPs),是將此次心跳間隔和下次心跳間隔畫在圖上。假設每次心跳間隔都相同,則數據點都會落在同一點上,但因為有心跳變異性,所以健康人應該會是分散的。

我在搜尋這圖片資料時,經常看到一張標示出處是台北榮總(Taipei Veterans General Hospital, Taiwan)的圖片,是觀察不同年齡和身體狀況的病人的心跳間隔。新生兒位於左下角,而右上角是加護病房的病人。




心跳間隔的直方圖
這是以50 ms為間隔,藉由這張圖可以分析壓力,例如 baevsky stress index這個壓力指數。處於壓力之下的人,交感神經活性強,心率變異會降低,所以直方圖會變窄而高,大多數心跳間隔位在一個小小區間內。而壓力低的人,有比較高的心率變異,所以直方圖會矮而寬。
方法是:

  • 分子為發生頻率最高區間次數佔全部心率次數百分比,例如下圖高度約為169,全部心跳數為296,分子為 57%
  • Mo為發生頻率最高區間的心率值,單位為秒。此圖為750-800之間,取0.775秒
  • var 心率分佈區間,最高心率與最低心率區間相差,單位為秒。此圖為(900-650)/1000=0.25
  • SI即為壓力指數147



我在國內一家作心率感測的舒壓儀廠商的說明書看到的壓力指數與壓力狀態的對應關係如下
  • 小於 50 紀錄異常導致訊號讀取不正確或長期接受紓壓訓練
  • 50-150 為一般正常狀態
  • 150-500 心理壓力偏大,或是過度運動導致的疲勞狀態
  • 500-900 表示嚴重心理壓力,長時間處於高壓狀態,或是心臟跳動有異常
  • >900 表示高度心理壓力或是存在其他生理疾病,需尋求醫師協助
其參考的文獻如下
  • Roman М. Baevsky, A.G.C., Heart rate variability analysis: physiological foundations and main methods. Cardiometry, 2017. 10: p. 66-76.

  • Bayevsky, R.M., et al., HRV Analysis under the usage of different electrocardiography systems ((Methodical recommendations) The Committee of Clinic Diagnostic Apparatus and The Committee of New Medical Techniques of Ministry of Health of Russia, protocol, 2002. 4.



以下是整個時域分析和頻域分析的程式說明和結果影片


【用micro:bit與脈搏感應器偵測脈搏。再以python做時域和頻域分析HRV,用以分析自律神經活性與身體狀況】

程式位置


最後可以產生的報告如下圖


2023年2月7日

脈搏感應器PPG的應用(5):心率變異性的時域分析

既然一直說到心率變異性與自律神經的活性是有關係的,那麼怎麼量化呢?


我在micro:bit裡頭也實作了兩個時域分析,只要按下A+B鍵就會將先前紀錄的脈搏資料作分析,算出SDNN和RMSSD
脈搏與心輸出感測程式


操作方法
1.將程式傳入micro:bit之後,開啟Show Data觀看圖表
2.確認閾值落在第一高峰之下,而不會碰到第二高峰。你可以按A和B調整閾值高低
3.先按下A+B,它會先將之前資料做運算以及歸零,然後畫面會停止
4.在按下A+B,圖表開始記錄目前的脈搏波形以及算出BPM
5.大約3~5分鐘後,按下A+B,輸出會停止,就會看到剛剛那段時間的時域分析

SDNN
SDNN是兩個正常心跳之間間隔的標準差,單位是毫秒。此數值越高表示自律神經比較平衡
NN是 normal-to-normal
SDNN是 standard deviation of the NN interval


RMSSD
RMSSD是RMSSD (Root Mean Square of the Successive Differences),代表兩正常心跳心率間隔差值(後一個心率間距和前一個心率間距 RR 的差值)的均方根。差值平方後相加,再做平均,然後開根號,單位為也是毫秒。此數值越高表示副交感神經越活躍


這個計算來自1996年時,歐洲心臟醫學會(European Society of Cardiology)制定的心率變異性臨床指引
Heart rate variability Standards of measurement, physiological interpretation, and clinical use


有了數據,那麼到底多少才算正常或太高、太低呢?這就需要常模了,因為心率變異性受到年齡、身體狀況、是否運動、量測姿勢...等影響。所以需要跟同齡常模來相比會比較合理。


SDNN常模
先列出幾個SDNN的常模
1.medi-core的 SA-300P的資料
 http://medi-core.com/download/HRV_clinical_manual_ver3.0.pdf



2.Andreas Voss等人在2015年調查不同年齡階段的各種時域分析和頻域分析的指標數值
論文Short-Term Heart Rate Variability—Influence of Gender and Age in Healthy Subjects
EHRV這個網站有再將資料表格整理如下

3. 2011年有一個研究有韓國人的分齡常模
男性常模
女性常模


4.在此診所的HRV判別報告說明裡也有兩張圖表可作為常模參考


這些常模來自不同的研究和不同的族群,要說應該用哪個常模來比較,其實我也不知道,但是可以看到的現象是SDNN會隨著年齡遞減。也就是年紀越大,心率變異性會降低。

除了和別人比以外,其實自己和自己也是很好比較的對象。確保自己每次都在同樣的狀態、同樣的姿勢、同樣的時間點量測。比較自己的生理心理狀態的差異,去看自己的SDNN或RMSSD的變化,也是很有趣的。

又或者你可以再回頭試試看,當你整個人縮在電腦前低頭駝背含胸時,你的SDNN會是多少。而當你能自然擴展胸腔,並且進行腹式呼吸時,SDNN又會是多少?

除了SDNN和 RMSSD之外,在時域分析上也會使用 pNN50,這代表正常心率相鄰兩個間距時間差超過 50 毫秒佔全部心率間隔數量的百分比。單位為 % 。也會用於自律神經的評估。





脈搏感應器PPG的應用(4):不同生理狀況,脈搏怎麼變化

讓我用一張簡圖說明一下這篇玩弄身體心搏變化的原理是什麼。在主動脈弓和頸動脈竇的血管壁有感壓受器,可以偵測血壓變化,把訊號傳入腦幹中的延腦。而延腦可以藉由副交感神經和交感神經去控制心臟搏動。

簡化的過程如下。想知道更進一步的細節,可以再搜尋baroreflex看資料。這部影片的說明很不錯。  Baroreflex Regulation of Blood Pressure, Animation.

  • 感壓受器感受到血壓增加→中樞→心搏降低→血壓降低
  • 感壓受器感受到血壓降低→中樞→心搏增加→血壓增加
中樞調控心搏快慢則是藉由交感和副交感神經來控制,例如要讓心搏增加,可以活化交感神經,或是降低副交感神經活性。


身體因應體內或體外的隨時變化,由交感和副交感兩種自律神經不斷調控,因此心搏的每次搏動間隔(interbeat interval)都會有些差異,記得嗎?這叫心率變異性(heart rate variability),自律神經功能越好,心率變異度會越大。後面幾篇會直接用程式去算出來心率變異度以及評估自律神經。我們這裡就先玩玩各種生理狀況,看看脈搏會怎麼變化吧。


刺激頸動脈
如果本身有心血管疾病的話,這可能有點危險。用手壓住頸動脈過十秒後放開。放開約5秒後,脈搏會降低到比前幾秒還低的狀況,然後又會開始變高。這可能原因是在放開頸動脈之後,突然增加的動脈血使得頸動脈體偵測到血壓增加,因此中樞使心搏降低,但是並不會一次降得剛好,血壓有點過低,所以會讓交感神經活化,使心搏增加,血壓再提升。在圖上有一個部份也能夠作為血壓的參考,那就是脈搏波形的峰值(注意看波峰與藍線的相對距離),這個波形反映了動脈血體積的變化,在血壓高的時候,波峰也會增高,所以你也能夠從波峰的高度變化間接看到血壓的變化。


坐姿改立姿
這沒有什麼危險性啦,就是坐著然後站起來,不過期間要確保手指與感測器的位置不要改變。在站起來之後,會看到動脈血體積減少,這時候血壓下降,因此會刺激自律神經使心搏加快,仔細看當心搏增加之後,血液體積也增加了。


努責現象(或叫伐氏呼吸 valsalva maneuver)
吸氣閉氣,緊閉喉頭,增加腹壓。這動作每個人都做過,其實就是便秘時肚子用力的樣子,或是重量訓練時穩固核心時也會這麼做。吸氣閉氣時,胸腔壓力增加,會減少肺靜脈血液流回左心房,使主動脈輸出血量減少(仔細看脈搏波形的峰值降低),這時候自律神經使心搏增加,在這張圖上我從原本的BPM約70,上升到94。恢復呼吸之後,心輸出量恢復正常,脈搏降低,感恩我自律神經。

吐氣閉氣
同樣是憋氣,但吐氣憋氣的結果就不太相同了,心搏一樣會增加,但是動脈血體積就沒有減少得那麼多了。


喝水
這個現象我也是偶然才發現的,喝水的同時會明顯看到心搏增加

我本來想是不是因為有水入喉,於是做了假喝水的動作,僅有吞嚥的動作,但沒有喝水,一樣產生心搏增加的現象

後來也有做喉頭下降但不吞嚥,卻發現沒有明顯變化。這個機制目前我不明白


駝背含胸呼吸姿勢
從前幾次測試應該已經知道呼吸運動和心搏是有相關的,不同的呼吸姿勢,例如駝背含胸時,呼吸短淺時,會發現心搏變化量較小,但如果是正常地讓胸腔能夠自由擴張,就能發現心搏的變化較為正常。



呼吸頻率與心率變化同步
在最前面講到的感壓反射-感受血壓變化來調整心搏快慢的感壓反射,身體並不是如同膝反射那樣會立刻反應,而是會有一段約10秒的延遲。所以在正常呼吸時,心搏本來就會有一點週期性變化,只是沒有那麼明顯。吸氣時抑制副交感神經,使心搏上升,吐氣時副交感神經回復活性,心搏下降,這稱為RSA (Respiratory Sinus Arrhythmia呼吸竇性心律不整),這種心律不整是一種正常生理現象。


雖然我們無法主動控制心搏,但是我們可以主動控制呼吸運動的頻率,讓它搭配心搏的變化週期,搭配上了之後,你就會看到非常明顯且規律的心律變動。控制到什麼程度,大約就是五秒吸五秒吐,一次呼吸約十秒的週期。

就像是推小孩盪鞦韆一樣,推的週期和盪的週期配合上了,你就可以把小孩推上天,這就是共振。這種降低頻率與心率搭配的呼吸叫做「共振頻率呼吸」(Resonance frequency breathing)。透過這個即時圖表,你可以看著BPM的變化曲線,當它降低時,你就吐氣讓它更低,當它高時,你就吸氣讓它更高,很簡單就做到生物反饋(biofeedback)。利用這種呼吸訓練,可以使副交感神經更活化。

你可能也想到了,許多智慧型手表都有著「壓力監測」的功能,其實就是從心率變異性去算出來的。壓力越大時,身體處在戰或逃的狀態,交感神經較為活化,此時心率變異性會較低。這類型手錶等,也都有「放鬆」的功能,方法都是藉由使用者主動降低呼吸頻率來達成放鬆。

要達到明顯呼吸頻率與心率變化同步,通常是十秒一個呼吸,但每個人會不太一樣,呼氣和吐氣的時間也不一定都是1:1,像我大概就是要 10.5秒到11 秒。要知道更細的資訊就要再用程式去算變異性,這個就之後文章再寫。


胸式呼吸與腹式呼吸
呼吸運動是藉由胸腔的擴張和縮小達成,而胸腔體積的變化同時由肋骨和橫膈位置改變來控制。胸式呼吸和腹式呼吸就像一個光譜的兩端,一端是完全由肋骨位置改變胸腔體積,另一端則是完全由橫膈位置變化來改變胸腔體積。你覺得你在這個呼吸光譜的那個位置?

在腹式呼吸的過程中,用橫膈變化來主導呼吸運動時,腹部自然而然就會在吸氣時突出,吐氣時縮回,這是再自然也不過了。但因為一種社會評價-「縮小腹才是美的帥的」,所以無時無刻都在縮小腹,這同時也限制了自己不能運用腹式呼吸。

我曾經刻意搜尋在YT上教大家縮小腹的影片,好幾個都是標榜著要讓自己呼吸時小腹都要平平的,因為這樣才能符合大家的美感,社會評價才會好。

坦白說,我在以前也都是這麼被影響著,但有一回聽到何立安博士在這集【#21 從子宮聊到白宮,什麼是現代人的裹小腳?怎麼救回失調的日之呼吸?】的論述「收小腹是現代人的裹小腳」之後,我才頓悟我一直都在限制自己的呼吸模式。這時我才開始解放腹部,使日常的呼吸模式變成腹式呼吸。

變成腹式呼吸之後,我發現最大的影響其實是說話,多年來我一直很困擾的是我總是得拿著麥克風才能上課,我會不斷囑咐著自己要用肚子用力來說話,但每次都失敗,每學期開始的第一週總是沙啞著喉嚨,我常常會想「每年都沙啞,我這樣還能當老師嗎」。但我開始在生活中就自然而然進行腹式呼吸之後,其實也才這幾年,我發現居然可以不用麥克風了!(但是在實驗室那種環境還是要啊)

那麼腹式呼吸和胸式呼吸在心率變異性的差異是什麼了?我也做了試驗。在腹式呼吸時,藉由降低橫膈使胸腔體積變化量提高,在心率變異性上很明顯大於胸式呼吸(最大心率更大,最小心率更小)。如果你習慣駝背含胸再加上胸式呼吸,其實就是垂頭喪氣的樣子,或是縮著身體打電腦的樣子,你應該可以猜得出來你的心率變異性會是如何吧?



呼吸姿勢和模式會透過自律神經影響心率變異性,反過來,在改善自律神經功能上,呼吸的姿勢和模式也會是個重要的角色。

2023年2月6日

脈搏感應器PPG的應用(3):看見脈搏變化

既然已經可以用脈搏計聽到脈搏的變化,那麼可不可以看到脈搏數目的變化呢?

當然可以,效果就會這樣,分成兩個圖表,上面是脈搏波形,下面是脈搏數(BPM)的變化圖。



程式我已經寫好了,就放在這裡。使用上唯一需要注意的是,盡量讓閾值落在第一高峰和第二高峰之間,程式會自動微調,但若突然大規模變動還是要自己調整,你可以按A增加閾值、按B降低閾值。

脈搏與心輸出感測程式

如果想要呈現長時間的資料,你可以縮小瀏覽器,按下【ctrl -】,若要放大則是【ctrl +】

計算BPM的基礎

其實我們每次心跳間隔並不是完全相同的。舉例來說,如果你的一分鐘心跳數是60下,這並不代表你每次心跳間隔就是1000毫秒,它可能是這次到下次的間隔是1010毫秒,下次到下下次是950毫秒...,在一分鐘內的時間內,一共搏動了60下。

每次心跳間隔的時間稱為 Interbeat interval (IBI) ,如果是用ECG的波形來看,通常是用前後兩個RR之間的間隔來計算,所以也稱為 R-R interval


每次心跳間隔不相同的這個現象稱為心率變異性,這在後面的文章會再提到,是可以用來評估自律神經狀況的。

回到脈搏數這件事,在以下介紹的程式中,就是用這個心跳間隔時間來計算每次的脈搏有多快,例如間隔是 1010 ms,那麼該次心跳的BPM就是 60x1000/1010 = 59.4,下次間隔是950 ms,則BPM是 60x1000/950 = 63.16,以此類推。


以下是關於程式設計的細節

峰值偵測


在PPG裡頭,峰值的特徵很明顯,但要怎麼找到它呢?我的邏輯是
  1. 峰值的點會比前一個點和後一個點高。這個很明顯,能長成這樣的才會是峰
  2. 峰必須高於閾值。這條件很重要,不然隨便一個波動都可能會被偵測成峰
  3. PPG的波形裡會有兩個峰,第二個峰叫做重搏峰,這在我們談到血管狀況評估時會再提到。排除重搏峰的方式,我就用「峰之間的時間差必須大於某個數值」


在micro:bit的程式裡,我就用這個函式來偵測峰值,傳入的三個item都是陣列元素,每個item內有兩個元素,第一個是時間戳記,第二個是感測的數值。拿來比較的都是陣列中的第二個元素(index為1)。


資料結構

三個元素是用queue的資料結構儲存,一個queue只會存放三個元素,每次新的資料變成新的元素從queue的尾端放入,然後開始偵測中間那個元素是不是峰值。

如果出現峰值,就會把時間紀錄下來跟前一個峰值時間做運算,算出新的峰的BPM。最後將每次的脈搏波形和BPM都從序列埠印出。

序列埠輸出

這裡用了一個技巧,讓micro:bit的圖表能同時呈現兩種不同資訊。首先脈搏波形的部分是用【序列寫入一行文字】,而BPM則是用【序列寫入值】,兩種不同的輸出方式,就會讓micro:bit用兩個圖表來顯示。


而在脈搏波形的部分,同時輸出了5種數字,第一個是偵測到的脈搏訊號,第二個則是閾值,第三個到第五個的900、400、650,則是用來限制Y軸的顯示範圍,同時也來做訊號的參考比較。因為makecode的圖表顯示預設會用當下畫面裡的最大值和最小值來當範圍,如果沒有做這些限制的話,圖表會因為當下數值的範圍而自動產生垂直縮放,這在後續做一些生理狀況觀察時,會不方便比較。

閾值的部分,雖然我已經用一個IIR Filter(alpha = 0.99)去獲取直流成分來產生動態閾值,但還是可能需要調整,你可以直接按A或B去調整閾值的範圍,使它落在第一高峰和第二高峰的數值範圍之間。




脈搏感應器PPG的應用(2):聽見心搏與脈搏的同步性

在國中實驗裡,有個讓學生三人一組聽心音脈搏的實驗,假設A是被聽,B負責聽A的心搏,C負責感覺A的脈搏,聽完一段時間後寫下心搏和脈搏的數字。

基於眾多原因,如沒聽到、沒摸到、沒同時算到...我的學生能回報出相同數字的極為少數,就算有也可能只是巧合而已。

如何解決這樣的問題?第一個需要一個能聽心音的機器,並且放音出來,這個就唯一推薦胎音機了,就是我在這篇文章【超音波胎音機放送心音】所寫到的東西,買了十年了都是靠它來上課了解心音。

那麼脈搏呢?過去我曾經用過那種手指搭在鏡頭上顯示脈搏的App,同時讓學生聽心音和看脈搏起伏,自從micro:bit推出內建喇叭的V2之後,我相當推薦自己做一個脈搏機會更好。

首先如果是想看到脈搏,就寫這樣一個積木就可以。當然感測器的三個pin也要跟micro:bit相連

感測器的 S 接到 Micro:bit 的 P1

感測器的 G 接到 Micro:bit 的 Gnd

感測器的 V 接到 Micro:bit 的 3V




上傳micro:bit之後,開啟Show Data,手指貼上感應器後,馬上就可以從裝置看到數值變化,每個高峰就是動脈中血液體積增加的時刻




如果我們希望這個脈搏計能夠有聲音的功能的話,我們就要增加一個偵測峰值的功能,讓程式偵測到峰值之後就叫一下,這就是我說要用 micro:bit的原因了,因為若是用v1,你還得另外接蜂鳴器才行。


怎麼偵測峰值呢,我們要先設定一個閾值,當數值超過那個數值之後就開始叫。不過閾值要多少呢,你大概很難直接從輸出的圖表中看到要多少數值才好,所以我們再修改一下程式,變成這樣。用字串組合的積木,把數值和某個數字用逗號做間隔來輸出。


這麼一來,你產生的圖就會變這樣,那條水平線就可以讓你看到閾值應該設定多少才好。不過並不是每個人或每次測量都可以使用同樣的閾值,因為動脈血的體積會根據你按壓感測器的力道、你的姿勢、甚至你的呼吸而發生不同的變化。

接下來我們再修改一下程式,變成這樣。


上傳到micro:bit之後,你就可以聽到自己的脈搏了。

有了脈搏計之後,再搭配上心音計,同時使用就可以同時聽見心音和脈搏了。