低コストで心拍間隔変動を測ってみる

# はじめに
ストレス状態をみるのに、心拍間隔変動（HRV)が指標になるらしい。例えば、[ストレスと自律神経の科学]
(http://hclab.sakura.ne.jp/stress_novice_LFHF.html)。なるべく低コストでストレス状況が測れないか試してみた。
# ラズベリーパイと心拍センサー
知識皆無なので、偉大な先人に習う。
[Heart Rate monitor using Raspberry Pi and Pulse sensor](http://udayankumar.com/2016/05/17/heart-beat-raspberry/)。Raspberry Pi, ADS1015,Pulse sensorを購入。eBay使わなかったし、新品のみで、合計8000円くらいかな。あちこち手配したけど、今見るとスイッチサイエンスで簡単に手に入ったかなと思う。組み立てもそのまま。ADCとジャンパーケーブルの間が安定しないので、はんだ付けした。不慣れな私にはこれがかなり難しかった。
＃コード
[リンク](https://github.com/udayankumar/heart-rate-raspberry-pi)からpython codeをダウンロード。オリジナルでは心拍間隔（IBI）は捨てているので、それだけ、dataIBI.append(data)を追加して、IBIの時系列データを得るようにした。もう1つ、測定時間を決めて、それ以上になったところでデータをセーブする手順を加えた。結局、３行ほど加えただけ。
＃データの取得
とりあえず、部屋を静かにした時、うるさくした時の２度測って見る。自覚する心拍と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）の積分。

```m:HFLF.m
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)青が静かな時、赤がうるさい時。３つ目、パワースペクトル密度（PSD；power spectral density）を計算するみたいだけど、そのうち修正するつもりではいる。静かな時、うるさい時の平均心拍数は79.4と77.9。低周波数成分はそれぞれ0.6754、0.5266,高周波数成分は0.5612,0.6518。~~低周波数成分はそれぞれ0.7121、0.5450~,高周波数成分は~1.2099,1.1697~~。

# 考察
1. 低コスト装置でHRVを測れないかどうかやってみた。自覚する心拍とRaspberry Piの心拍数は一致していた。
2. 静かな時と、うるさい時での変動があるかやってみた。自覚的にはうるさい時はストレスを感じていた。が、平均心拍数は静かな時の方が高めだった。うるさいのはストレスでないのか、心拍数自体がストレスの指標にならないのか、データがまずいのか、コードがまずいのか、不明。ま、一回試しただけだし。そのうち。
3. うるさい時にLFは低め、HFは高め。LF/VFも低め。[心拍揺らぎによる精神的ストレス評価法に関する研究](https://www.jstage.jst.go.jp/article/lifesupport/22/3/22_105/_pdf)とか、[Validation of the Apple Watch for Heart Rate Variability Measurements during Relax and Mental Stress in Healthy Subjects](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6111985/)とかに書かれているように、ストレスでLF,HFが下がり、LF/HFが上がるというとはそぐわない。
4. 今検討中のパワースペクトル密度（PSD；power spectral density）でも同様の変化が見られるので、どっちかというと、計測条件（静か、うるさい）があまり適していない可能性が高いと思う。
5. 電池と小型モニターをつなげ、コードを修正、さらにPythonに書き換えれば、ポータブル心拍間隔変動測定装置ができるはず。