はじめに
ストレス状態をみるのに、心拍間隔変動(HRV)が指標になるらしい。例えば、[ストレスと自律神経の科学]
(http://hclab.sakura.ne.jp/stress_novice_LFHF.html)。なるべく低コストでストレス状況が測れないか試してみた。
ラズベリーパイと心拍センサー
知識皆無なので、偉大な先人に習う。
Heart Rate monitor using Raspberry Pi and Pulse sensor。Raspberry Pi, ADS1015,Pulse sensorを購入。eBay使わなかったし、新品のみで、合計8000円くらいかな。あちこち手配したけど、今見るとスイッチサイエンスで簡単に手に入ったかなと思う。組み立てもそのまま。ADCとジャンパーケーブルの間が安定しないので、はんだ付けした。不慣れな私にはこれがかなり難しかった。
#コード
リンクからpython codeをダウンロード。オリジナルでは心拍間隔(IBI)は捨てているので、それだけ、dataIBI.append(data)を追加して、IBIの時系列データを得るようにした。もう1つ、測定時間を決めて、それ以上になったところでデータをセーブする手順を加えた。結局、3行ほど加えただけ。
#データの取得
とりあえず、部屋を静かにした時、うるさくした時の2度測って見る。自覚する心拍とRaspberry Piの心拍は一致している。
#Matlab 処理
ここで、Raspberry pi上のpythonでデータ処理するとかっこいいのに。と思うのだけど、とりあえず、結果見たいので、PCにデータをうつして、Matlabで処理。最近マイブームのフーリエ解析で。って、こちらもよく分かっているわけでないので、適当に補完を使って、またまたいい加減に書いて見た。正直、正しいかどうかよくわからない。**全くデタラメの可能性もある。**叩き台としてのコードはここ。入力は得られたIBI。出力はtimeB:測定期間を0.01秒ごとの等間隔にした数列、IBIv:素のIBIデータを0.01秒間隔として補完したもの、f:フーリエ解析で得られた周波数(Hz)、P1:フーリエ解析で得られたスペクトラム、LF:低周波数成分(0.04〜0.15Hz)の積分、HF:高周波数成分(0.15〜0.40Hz)の積分。
function [timeB IBIv f P1 HF LF] = HFLF(IBI)
time = [];
for i = 1:size(IBI,2)
time(i)=(sum(IBI(1:i))-IBI(1))/1000;
end
timeB=0:0.01:time(size(time,2)); % set with 100Hz
%IBIv=interp1(time,IBI,timeB);% interpolation
IBIv=spline(time,IBI,timeB);% interpolation
Fs=100; % 100Hz
Y=fft(IBIv);
L = size(timeB,2);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;
~% LF 0.05 - 0.15
a1=min(find(f>0.04));
b1=max(find(f<0.15));
c1 = 0;
for i = a1+1:b1-1
c1=c1+P1(i);
end
%LF = c1*(f(b1) - f(a1))/(b1 - a1);
LF = (c1+(P(a1)+P(b1))/2) * (f(b1) - f(a1))/(b1 - a1);
% HF 0.15 - 0.40
a2=b1+1; %corrected from a1 to b1
b2=max(find(f<0.40));
c2 = 0;
for i = a2+1:b2-1
c2=c2+P1(i);
end
%HF = c2*(f(b2) - f(a2))/(b2 - a2);
HF = (c2+(P(a2)+P(b2))/2)*(f(b2) - f(a2))/(b2 - a2);
プロット
[ストレスと自律神経の科学]
(http://hclab.sakura.ne.jp/stress_novice_LFHF.html)とか、[心拍揺らぎによる精神的ストレス評価法に関する研究](https://www.jstage.jst.go.jp/article/lifesupport/22/3/22_105/_pdf)とか参照にして、部屋を静かにした時、うるさくした時のデータをプロットして見た。![SilentNoise.png](https://qiita-image-store.s3.amazonaws.com/0/237763/ab393a47-4b76-f64a-a1f1-a0ee1e402ece.png)青が静かな時、赤がうるさい時。3つ目、パワースペクトル密度(PSD;power spectral density)を計算するみたいだけど、そのうち修正するつもりではいる。静かな時、うるさい時の平均心拍数は79.4と77.9。低周波数成分はそれぞれ0.6754、0.5266,高周波数成分は0.5612,0.6518。低周波数成分はそれぞれ0.7121、0.5450~,高周波数成分は~1.2099,1.1697。
考察
- 低コスト装置でHRVを測れないかどうかやってみた。自覚する心拍とRaspberry Piの心拍数は一致していた。
- 静かな時と、うるさい時での変動があるかやってみた。自覚的にはうるさい時はストレスを感じていた。が、平均心拍数は静かな時の方が高めだった。うるさいのはストレスでないのか、心拍数自体がストレスの指標にならないのか、データがまずいのか、コードがまずいのか、不明。ま、一回試しただけだし。そのうち。
- うるさい時にLFは低め、HFは高め。LF/VFも低め。心拍揺らぎによる精神的ストレス評価法に関する研究とか、Validation of the Apple Watch for Heart Rate Variability Measurements during Relax and Mental Stress in Healthy Subjectsとかに書かれているように、ストレスでLF,HFが下がり、LF/HFが上がるというとはそぐわない。
- 今検討中のパワースペクトル密度(PSD;power spectral density)でも同様の変化が見られるので、どっちかというと、計測条件(静か、うるさい)があまり適していない可能性が高いと思う。
- 電池と小型モニターをつなげ、コードを修正、さらにPythonに書き換えれば、ポータブル心拍間隔変動測定装置ができるはず。