脈拍でストレスを検出する

前回計測した脈拍を利用して,自分のストレス状態を検出してみました.簡単なアルゴリズムで実装でき,脈拍以外に心電図なのでも同様な検出系を作ることができます

目次

はじめに

前回はスマートウォッチで脈拍を測ろうとして,結局センサを自作して測定しました.
https://lp-tech.net/articles/dsdkY
そのデータを元にストレスを検知する準備をしようと思います.

脈拍とストレスの関係

*ここは前回の記事で取り上げた書籍を参考にしてください
脈拍などの生体信号は規則正しい一定間隔で生じているわけではなく,わずかにゆらいでいて,それによって生体の状態を知ることができます.
心拍変動は自律神経系や液性調節系による調節を受けており,自立神経のうち,交感神経は心拍数を上昇させる.一方で副交感神経は心拍数を低下させます.昼間は交感神経が,夜は副交感神経が支配的になり,ストレスを受けると交感神経が活発になります.

脈拍の測定結果

脈拍計測データ

前回と同じ回路で計測しました.
筆者は極めて冷え性で,通常時は脈拍がほとんど検知されなかったため,
シャワーで体温を上げてから計測に挑みました.(統制がある実験は夏しかできないかもしれない,,,)

上のグラフではわかりにくので,0から10秒間だけを見たグラフ
かなり上手くピークが検出できました.

プログラム

beatRate_peak = beatRate - np.mean(beatRate)
for i in range(beatRate.size):
    if beatRate_peak[i] < 0:
        beatRate_peak[i] = 0

peaks, _ = sig.find_peaks(y_peak, distance=75)
detectPeak.py
マイナス側のピークを検出しないために,平均値以下の値を0と見なして
ピーク間の最低距離distance=75としています.
今回のサンプリングレートが100Hzで前回の結果よりピーク間隔が0.8s程度だったので
この値にしています.

ストレス検知のアルゴリズム

ピーク間距離RR

i番目とi+1番目のピーク間距離RRiが時間によってどのように変化するかをみると
生体信号のゆらぎをみることができます.

ピーク間距離計測データ

青い点が実データのプロットで,オレンジ線がスプライン補間したグラフです.
概ね1 s付近なのでデータとしては正しそうです.
また心拍の時間間隔なので一定に思いがちですが,ばらつきがあることがわかります.

プログラム

# plot raw RR
tRR = np.delete(t[peaks], 0)
RR = np.diff(t[peaks], n=1)
# interpolation
t_s = np.linspace(tRR[0], tRR[-1], num=8192)
RR_s = interp1d(tRR, RR, kind='cubic')(t_s)
interpolationRR.py

ピーク間距離時間の変動のFFT結果

結果の解釈
・0.04 Hz ~ 0.15 HzはLFと呼ばれ,交感神経と副交感神経の影響を受けていると考えられている.
・0.15 Hz ~ 0.40 HzはHFと呼ばれ,副交感神経が優位であると考えれている.
一般にLF/HFで評価され,グラフからは0.15 Hz以下の領域(LF)が支配的であると考えられるため
交感神経が優位であると考えられる,つまりストレスを感じています.

おわりに

脈拍のピーク間隔(RR間隔)を元にストレスの有無を検知してみました.
暗算やホラー映画なのでストレスを作り出した後に計測して,手法の整合性に検証する必要がありますね.
このRR間隔は睡眠時無呼吸症候群の検査にも用いられるようで,スマートウォッチで脈拍が計測できると充実したヘルスケアアプリができそうです.