這陣子用脈博感測器偵測到的不同人的脈搏波,可以看到不同的樣子,大致上有一個振幅比較大的波,後面伴隨著第二個波
來源:Photoplethysmogram Analysis and Applications: An Integrative Review
這陣子用脈博感測器偵測到的不同人的脈搏波,可以看到不同的樣子,大致上有一個振幅比較大的波,後面伴隨著第二個波
來源:Photoplethysmogram Analysis and Applications: An Integrative Review
讓我用一張簡圖說明一下這篇玩弄身體心搏變化的原理是什麼。在主動脈弓和頸動脈竇的血管壁有感壓受器,可以偵測血壓變化,把訊號傳入腦幹中的延腦。而延腦可以藉由副交感神經和交感神經去控制心臟搏動。
簡化的過程如下。想知道更進一步的細節,可以再搜尋baroreflex看資料。這部影片的說明很不錯。 Baroreflex Regulation of Blood Pressure, Animation.
既然已經可以用脈搏計聽到脈搏的變化,那麼可不可以看到脈搏數目的變化呢?
當然可以,效果就會這樣,分成兩個圖表,上面是脈搏波形,下面是脈搏數(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,以此類推。
以下是關於程式設計的細節
峰值偵測
在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去調整閾值的範圍,使它落在第一高峰和第二高峰的數值範圍之間。
在國中實驗裡,有個讓學生三人一組聽心音脈搏的實驗,假設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之後,你就可以聽到自己的脈搏了。
有了脈搏計之後,再搭配上心音計,同時使用就可以同時聽見心音和脈搏了。