Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
# 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())
Пример #7
0
                                 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')
Пример #8
0
    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)
Пример #9
0
# 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)
Пример #10
0
	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))
Пример #11
0
from opensignalsreader import OpenSignalsReader

# Read OpenSignals file
acq = OpenSignalsReader('tiago2.txt')

acq.plot()