def biosignal_multi_summary(path_list, emotion=None): i = 0 df_summary = None for path in path_list: print('{} ....start'.format(path)) for n in range(3): arc = OpenSignalsReader(path, multidevice=n) print("device= {}".format(n)) # 心拍変動 rri_peaks = signals.ecg.ecg(arc.signal('ECG'), show=False)['rpeaks'] # 呼吸変動 resp_peaks = resp_analysis.resp(arc.signal('RESP'), show=False)['peaks'] # 皮膚コンダクタンス scr_data = eda_analysis.scr(arc.signal('EDA'), downsamp=4) # キーワードを設定 keyword = {'id': i, 'path_name': path} df = pd.DataFrame([]) df = biosignal_features(rri_peaks, resp_peaks, scr_data, emotion, keyword) if i == 0: df_summary = pd.DataFrame([], columns=df.columns) # ファイルを結合 df_summary = pd.concat([df_summary, df], ignore_index=True) i += 1 return df_summary
def biosignal_time_summary(path, duration=300, overlap=150, skip_time=None, outpath=None): # 生体データを取得 arc = OpenSignalsReader(path) # 時間変数を作成 time_ = np.arange(duration, arc.t.max(), overlap) label_ = time_ if skip_time is not None: time_ = time_ + skip_time section_ = zip((time_ - duration), time_) emotion = dict(zip(label_.tolist(), section_)) # HRV Features rri_peaks = signals.ecg.ecg(arc.signal('ECG'), sampling_rate=1000.0, show=False)['rpeaks'] # RESP Features resp_peaks = resp_analysis.resp(arc.signal('RESP'), sampling_rate=1000.0, show=False)['peaks'] # EDA Features scr_data = eda_analysis.scr(arc.signal('EDA'), sampling_rate=1000.0, downsamp=4) df = pd.DataFrame([]) # 各生体データを時間区間りで算出 df = biosignal_features(rri_peaks, resp_peaks, scr_data, emotion) return df
def plot_signal(path): arc = OpenSignalsReader(path) # 心拍データからピークを取り出す ecg_result = signals.ecg.ecg(signal=arc.signal(['ECG']), sampling_rate=1000.0, show=False) # 皮膚コンダクタンス からSCRを取り出す #eda_result = eda_analysis.scr(arc.signal(['EDA'])) eda_result = eda_analysis.eda_preprocess(arc.signal(['EDA']), 1000.) # 呼吸周波数を取り出す resp_result = resp_analysis.resp(arc.signal('RESP'), show=False) # output # ECG np.savetxt(r"C:\Users\akito\Desktop\2019年度発表スライド\ecg_sample.csv", ecg_result["rpeaks"], delimiter=",") # EDA np.savetxt(r"C:\Users\akito\Desktop\2019年度発表スライド\eda_sample.csv", eda_result[::25]) # RESP np.savetxt(r"C:\Users\akito\Desktop\2019年度発表スライド\resp_sample.csv", np.c_[resp_result['resp_rate_ts'], resp_result['resp_rate']]) # 描画設定 fig, axes = plt.subplots(3, 1, sharex=True, figsize=(16, 9), subplot_kw=({ "xticks": np.arange(0, 1200, 100) })) axes[0].set_title(path) # 心拍変動の描画 axes[0].plot(ecg_result['heart_rate_ts'], ecg_result['heart_rate'], 'b') axes[0].set_xlim(0, 1200) axes[0].set_ylabel("HR[bpm]") # 皮膚コンダクタンスの描画 axes[1].plot(eda_result['ts'], eda_result['filtered']) axes[1].set_ylabel('SCR[us]') # 呼吸の描画 axes[2].plot(resp_result['resp_rate_ts'], resp_result['resp_rate'], 'b') axes[2].set_ylabel('RESP[Hz]') axes[2].set_ylim(0, 0.5) for i in range(3): axes[i].axvspan(300, 600, alpha=0.3, color="r", label="Stress") axes[i].axvspan(900, 1200, alpha=0.3, color="b", label="Amusement") plt.legend() plt.tight_layout() plt.xlabel("Time[s]") return plt
def biosignal_summary(path_list, emotion=None, output_path=None): for i, path in enumerate(path_list): print(path + ' ....start') # ファイル名およぶフォルダ名を取得 dict_path = os.path.dirname(path) fname = os.path.splitext(os.path.basename(path))[0] # pathから名前と日付に変換する user = dict_path.split("\\")[-1] day, time = fname.split("_")[-2:] date = datetime.datetime.strptime(day + " " + time, '%Y-%m-%d %H-%M-%S') # キーワードを設定 keyword = {'id': i, 'path_name': path, 'user': user, 'date': date} arc = OpenSignalsReader(path) # 心拍変動 rri_peaks = signals.ecg.ecg(arc.signal('ECG'), sampling_rate=1000.0, show=False)['rpeaks'] # 呼吸変動 resp_peaks = resp_analysis.resp(arc.signal('RESP'), sampling_rate=1000.0, show=False)['peaks'] # 皮膚コンダクタンス scr_data = eda_analysis.scr(arc.signal('EDA'), sampling_rate=1000.0, downsamp=4) df = pd.DataFrame([]) df = biosignal_features(rri_peaks, resp_peaks, scr_data, emotion, keyword) if i == 0: if output_path == None: df_summary = pd.DataFrame([], columns=df.columns) else: df_summary = pd.read_excel(output_path) # ファイルを結合 df_summary = pd.concat([df_summary, df], ignore_index=True) df_summary.to_excel(output_path) return df_summary
def plot_raw(path, emotion_section={ "Stress": [300, 600], "Amusement": [900, 1200] }): arc = OpenSignalsReader(path) # 心拍データからピークを取り出す ecg_result = signals.ecg.ecg(signal=arc.signal(['ECG']), sampling_rate=1000.0, show=False) # 皮膚コンダクタンス からSCRを取り出す eda_filtered = eda_analysis.eda_preprocess(arc.signal(['EDA']), 1000.) # 呼吸周波数を取り出す resp_result = resp_analysis.resp(arc.signal('RESP'), show=False) # 描画設定 fig, axes = plt.subplots(3, 1, sharex=True, figsize=(16, 9), subplot_kw=({ "xticks": np.arange(0, 1200, 100) })) axes[0].set_title(path) # 心拍変動の描画 axes[0].plot(ecg_result['heart_rate_ts'], ecg_result['heart_rate'], 'b') axes[0].set_xlim(0, 1200) axes[0].set_ylabel("HR[bpm]") # 皮膚コンダクタンスの描画 axes[1].plot(arc.t, arc.signal(['EDA'])) axes[1].set_ylabel('[us]') axes[1].set_ylim(0, 25) # 呼吸の描画 axes[2].plot(arc.t, arc.signal(['RESP'])) axes[2].set_ylabel('RESP[Hz]') axes[2].set_ylim(-50, 50) for i in range(3): for key in emotion_section.keys(): if key == "Stress": axes[i].axvspan( emotion_section[key][0], #start emotion_section[key][1], #end alpha=0.3, color="r", label="Stress") elif key == "Amusement": axes[i].axvspan( emotion_section[key][0], #start emotion_section[key][1], #end alpha=0.3, color="b", label="Amusement") plt.legend() plt.tight_layout() plt.xlabel("Time[s]") return plt
# import package import numpy as np import pandas as pd import seaborn as sns from biosppy import signals import matplotlib.pyplot as plt import pyhrv.tools as tools # import local import eda_analysis import resp_analysis import pyhrv.frequency_domain as fd from opensignalsreader import OpenSignalsReader import biosignal_plot path = r"C:\Users\akito\Desktop\test.txt" arc = OpenSignalsReader(path) # 心拍データからピークを取り出す ecg_result = signals.ecg.ecg(signal=arc.signal(['ECG']), sampling_rate=1000.0, show=False) # 呼吸周波数を取り出す resp_result = resp_analysis.resp(arc.signal('RESP'), show=False) # 描画設定 fig, axes = plt.subplots(2, 1, sharex=True, figsize=(16, 9)) axes[0].set_title(path) # Compute NNI series nni = tools.nn_intervals(ecg_result['rpeaks'].tolist())
nperseg=N) plt.plot(freq1, power1, "b") freq2, power2 = signal.welch(filter[(300 <= ts) & (ts < 600)], fs=1000.0, window='hanning', nperseg=N) plt.plot(freq2, power2, "r") plt.xlabel("Frequency[Hz]") plt.ylabel("Power/frequency[dB/Hz]") plt.xlim(0, 10) plt.show() if __name__ == '__main__': path = r"C:\Users\akito\Desktop\stress\02.BiometricData\opensignals_201808080162_2019-09-26_12-57-32.txt" arc = OpenSignalsReader(path) result = resp(signal=arc.signal('RESP'), sampling_rate=1000., show=False) np.savetxt(r"C:\Users\akito\Desktop\respiration.csv", np.c_[result['ts'][::10], result['filtered'][::10]], delimiter=",") #plt.plot(result['inspiration'][1:],(result['inspiration'][1:] - result['expiration'])) #plt.show() #resp_features = resp_features(result['peaks'][(result['peaks'] > 600000) & (result['peaks'] < 900000)]) #fig,axes = plt.subplots(2,1,sharex=True) #axes[0].plot(result['peaks'][1:]*0.001,np.diff(result['peaks'])*0.001) #axes[1].plot(result['ts'],result['filtered']) #for ins,exp,peak in zip(result['inspiration'], result['expiration'], result['peaks']): # axes[1].axvline(ins*0.001,color= 'b') # axes[1].axvline(exp*0.001,color= 'r') # axes[1].axvline(peak*0.001,color= 'g')
if index_outlier.size > 0: # 閾値を超えれば,スプライン関数で補間 flag = np.ones(len(nni), dtype=bool) flag[index_outlier.tolist()] = False nni_spline = interpolate.interp1d(ts[flag], nni[flag], 'cubic') nni = nni_spline(ts) return nni if __name__ == '__main__': path = r"Z:\theme\mental_arithmetic\03.BiometricData\2019-12-12\shizuya\opensignals_device2_2019-12-12_11-15-27.txt" from opensignalsreader import OpenSignalsReader from biosppy import signals as sn # Read OpenSignals file and plot all signals arc = OpenSignalsReader(path) # peak detection signals, rpeaks = sn.ecg.ecg(signal=arc.signal("ECG"), sampling_rate=1000.0, show=False)[1:3] # peaks to nni nni = tools.nn_intervals(rpeaks[rpeaks >= 900000].tolist()) #nni = np.loadtxt(r"Z:\theme\mental_arithmetic\04.Analysis\Analysis_BioSignal\ECG\RRI_kishida_2019-11-21_16-00-52.csv",delimiter=",") #print(welch_psd(rri)) #print(lomb_psd(nni=rri)) #print(ar_psd(nni=rri)) a = _artefact_correction(nni=nni, threshold=0.25) print(a) #wavelet(rri)
# RRIから特徴量を算出する nni = np.loadtxt(path, delimiter=",") result = hf.segumentation_features(nni, sample_time=120, time_step=30) # 結果をエクスポート result.to_excel(outpath) #text = "shibata_2020-02-05" #outpath = r"Z:\theme\robot_communication\04_Analysis\Analysis_TimeVaries\features_{}.xlsx".format(text) #rripath = r"Z:\theme\robot_communication\04_Analysis\Analysis_Biosignal\rri_{}.csv".format(text) record_path = r"C:\Users\akito\Desktop\実験データ\data2\2020-02-05\takase\robot_communication_2020_02_05__17_40_20.csv" path = r"C:\Users\akito\Desktop\実験データ\data2\2020-02-05\takase\opensignals_device2_2020-02-05_17-09-27.txt" # Read OpenSignals file and plot all signals arc = OpenSignalsReader(path) ## 時間のずれを算出 #exp_start = dt.strptime(time_record.loc["Neutral","StartDatetime"], '%Y-%m-%d %H:%M:%S.%f') #duration = (exp_start - time_start).total_seconds() #outpath_features = r"C:\Users\akito\Desktop\実験データ\data2\RRI\features_shibata.xlsx" outpath_rri = r"C:\Users\akito\Desktop\実験データ\data2\RRI\0205_takse_ECG_RRI.xlsx" # peak detection #signal, rpeaks= signals.ecg.ecg(signal= arc.signal("ECG")[int(duration*1000):], sampling_rate=1000.0, show=False)[1:3] #nni = tools.nn_intervals(rpeaks.tolist()) #np.savetxt(rripath ,nni, delimiter=',' ) #df = biosignal_time_summary(path,duration = 300, overlap = 30, skip_time = duration) #df.to_excel(outpath)
return nni if __name__ == "__main__": """ Example Script - HRV Tools """ import pyhrv.time_domain as td from opensignalsreader import OpenSignalsReader from biosppy.signals.ecg import ecg # Change path to your preferred directory path = './files/' # Load OpenSignals (r)evolution ECG sample file acq = OpenSignalsReader(path + 'SampleECG.txt') signal = acq.signal('ECG') sampling_rate = acq.sampling_rate # Filter data & get r-peak locations [ms] signal, rpeaks = ecg(signal, sampling_rate=sampling_rate, show=False)[1:3] # Plot ECG & save plot figure results = plot_ecg(signal, sampling_rate=sampling_rate, show=True, interval=[0, 22]) # Plot Tachogram & save plot figure results = join_tuples(results, tachogram(rpeaks=rpeaks, show=False)) # Compute Time Domain Parameters results = join_tuples(results, td.time_domain(rpeaks=rpeaks, plot=True, show=False))
from opensignalsreader import OpenSignalsReader # Read OpenSignals file acq = OpenSignalsReader('tiago2.txt') acq.plot()