Bitalinoで心電を計測する際に、以下の写真のようにピーク間に規則性のあるノイズが必ず入ってきてしまいます。
以下の写真のようなノイズの大きさであれば、閾値を調整すればよいのですが、このノイズが大きく入ってきた際には心拍数が狂ってきてしまいます。
そこで質問なのですが、pythonでこのような規則性のあるノイズを除去する方法を教えていただきたいです。
よろしくお願い致します。
python
1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4from scipy import signal 5#from matplotlib import pyplot as plt 6 7#データの読み込み 8f = pd.read_csv("file:///C:/Users/81806/.spyder-py3/test-wave11.csv", encoding="utf-8") 9 10N = len(f) 11 12f_x = (f["time"]) 13f_y = (f["ECG"]) 14 15 16f_x2 = [] 17f_y2 = [] 18#グラフ描画 19for i in range(4000,25000): 20 f_x2.append(f_x[i] - 4) 21 f_y2.append(f_y[i]) 22 23plt.plot(f_x2,f_y2) 24plt.show() 25 26 27 28N = len(f) 29fss = 1024 #サンプリング周波数 30dt = 1/fss 31fn = 1/(2*dt) #ナイキスト周波数 32#2Hzのハイパス 33 #'''''''''''ハイパス''''''''''''''''''''''''''''''''''''''''''' 34 35#パラメータ設定 36fp = 1 #通過域端周波数[Hz] 37fs = 20 #阻止域端周波数[Hz] 38gpass = 1 #通過域最大損失量[dB] 39gstop = 40 #阻止域最小減衰量[dB] 40 41#正規化 42Wp = fp/fn 43Ws = fs/fn 44 45#バターワースフィルタ 46n, Wn = signal.buttord(Wp, Ws, gpass, gstop) 47b1, a1 = signal.butter(n, Wn, "high") 48y3 = signal.filtfilt(b1, a1, f_y2) 49n3 = len(y3) 50 51#グラフ描画 52plt.plot(f_x2,y3,"r") 53plt.show() 54 55 56#''''''''''ローパス''''''''''''''''''''''''''''''''''''''''''' 57 58 59#パラメータ設定 60fp = 30 #通過域端周波数[Hz] 61fs = 100 #阻止域端周波数[Hz] 62gpass = 1 #通過域最大損失量[dB] 63gstop = 40 #阻止域最小減衰量[dB] 64 65#正規化 66 67Wp = fp/fn 68Ws = fs/fn 69 70#バターワースフィルタ 71N, Wn = signal.buttord(Wp, Ws, gpass, gstop) 72b1, a1 = signal.butter(N, Wn, "low") 73y = signal.filtfilt(b1, a1, y3) 74N_P = len(y) 75 76#ピーク検出 77fp_x = [] 78fp_y = [] 79fpp_x = [] 80fpp_y = [] 81 82#ピーク検出(心拍) 83for i in range(1,N_P): 84 if (y[i] > 100): 85 if ((y[i] - y[i-1]) > 0 and (y[i+1] - y[i]) < 0): 86 fp_x.append(f_x2[i]) 87 fp_y.append(y[i]) 88 89 90 91 92print('--->>----') 93plt.plot(f_x2,y,"g") 94plt.scatter(fp_x,fp_y) 95plt.show() 96print('--->>----') 97 98#ピークの数を数える 99NPH = len(fp_y) 100NPH2 = len(fpp_y) 101print('心拍センサ上ピークの数',NPH) 102 103f = 0 104h = 0 105a = [] 106z = [] 107beat = [] 108time = [] 109 110while h < len(fp_x)-1: 111 a = fp_x[h + 1] - fp_x[h] 112 z = 60 / a 113 f = f + a 114 beat.append(z) 115 time.append(f) 116 h = h + 1 117#plt.plot(time,beat) 118#plt.scatter(time,beat) 119#plt.show() 120print('心拍') 121print(beat) 122 123plt.plot(f_x2,y,"r") 124#plt.ylim(0,200) 125#plt.xlim(0,20) 126plt.scatter(fp_x,fp_y) 127plt.plot(time,beat) 128plt.ylim(-400,400) 129plt.show()
回答2件
あなたの回答
tips
プレビュー