예제 #1
0
    def get_heartrate_and_breathing(self, data):
        framerate = self.framerate
        if self.resample != -1:
            data = resample(data,
                            (len(data) // self.framerate) * self.resample)
            framerate = self.resample

        if self.filter:
            data = hp.filter_signal(data, [0.7, 3.5],
                                    sample_rate=framerate,
                                    order=3,
                                    filtertype='bandpass')
            data = hp.scale_data(data)

        wd, m = hp.process(data, framerate, high_precision=True, clean_rr=True)

        self.m = m
        self.wd = wd
        hr = m["bpm"]
        rr = m["breathingrate"]

        if self.show:
            hp.plotter(wd, m)

        if self.save_path != '':
            save_plot(data, x_label="Time", y_label="BVP Signal")

        return hr, rr * 60
예제 #2
0
    def run_analysis(self, plot=False):

        # Filter the signal
        filtered = hp.filter_signal(self.data,
                                    cutoff=0.05,
                                    sample_rate=self.sample_rate,
                                    filtertype='notch')

        # Run analysis
        wd, m = hp.process(hp.scale_data(filtered), self.sample_rate)

        if plot:
            # Visualise in plot of custom size
            plt.figure(figsize=(12, 4))
            hp.plotter(wd, m)

        # Display computed measures
        for measure in m.keys():
            print('%s: %f' % (measure, m[measure]))

        return m
def process_ecg(data, show=False, framerate=BASE_FREQUENCY):
    filtered = hp.filter_signal(data, [0.7, 3.5],
                                sample_rate=framerate,
                                order=3,
                                filtertype='bandpass')
    #filtered = hp.remove_baseline_wander(filtered, FREQUENCY)
    wd, m = hp.process(hp.scale_data(filtered), framerate)
    if show:
        print(wd.keys())
        print(m.keys())
        hp.plotter(wd, m)

    save_plot(wd["breathing_signal"],
              str(framerate) + "breathing_signal_hp.png",
              framerate,
              x_label='Time (' + str(framerate) + 'hz)',
              y_label='Breathing Signal')

    hr = m["bpm"]
    rr = m["breathingrate"]
    RR_list = wd["RR_list"]

    return hr, rr, RR_list
예제 #4
0
    def plot_peaks(self):
        """Runs heartpy.plotter for visualizing filtered data and peaks."""

        heartpy.plotter(working_data=self.wd, measures=self.summary)
import heartpy as hp
import numpy
import csv

# convert txt file to csv
#txt_file_address = 'E:\\Lithic\\data\\heart\\heart-bill.txt'
txt_file_address = 'HR_2019-09-22T14-19-17.txt'
csv_file_address = txt_file_address.replace('txt','csv')
in_txt = csv.reader(open(txt_file_address, "r"), delimiter = ',')
out_csv = csv.writer(open(csv_file_address, 'w'))

out_csv.writerows(in_txt)
print(csv_file_address)

hrdata = hp.get_data(csv_file_address, column_name='Analog1_chB')
timerdata = hp.get_data(csv_file_address, column_name='Timestamp')

working_data, measures = hp.process(hrdata, hp.get_samplerate_mstimer(timerdata))
hp.plotter(working_data, measures, title='good plot')
예제 #6
0
label_records[0].p_signal

#!pip install heartpy

#!pip install heartpy
import heartpy as hp
import pandas as pd
import matplotlib.pyplot as plt

data = hp.scale_data(label_records[0].p_signal.T[0])
data0 = label_records[0].p_signal.T[0]
data0.shape

# get the location of R wave
working_data, measures = hp.process(data, 1000.0)
hp.plotter(working_data, measures)

# get index of R waves
peaklists = working_data['peaklist']
# remove the first one and last one
peaklists = peaklists[1:-1]
print("index of R waves:", peaklists)

# get the wave

records_sliced = []
for i in peaklists: 
  tem_data = data0[i - 400:i + 600] 
  records_sliced.append(tem_data)

plt.plot(tem_records_sliced[0]) 
예제 #7
0
파일: data_parser.py 프로젝트: mbrs/yasu
                                sample_rate=_sampleRate,
                                order=3,
                                return_top=False)

plt.figure(figsize=(22, 6))
plt.plot(filtered_ppg)
plt.show()

wd, m = hp.process(filtered_ppg,
                   sample_rate=_sampleRate,
                   high_precision=True,
                   clean_rr=True,
                   clean_rr_method='iqr')

plt.figure(figsize=(22, 6))
hp.plotter(wd, m)

for dict_value in m:
    for k, v in m.items():
        m[k] = round(v, 1)

m.keys

for key in m.keys():
    print('%s: %f' % (key, m[key]))

#wd['RR_list']
#wd['peaklist_cor']
#wd['peaklist']
#wd['binary_peaklist']
def medicion_ritmo_cardiaco():

    # Comencemos con nuestro primer ejemplo
    # Señal capturada con un pulsómetro con la técnica
    # de fotoplestimografía (PPG).
    data, timer = hp.load_exampledata(0)
    sample_rate = 100

    plt.figure()
    plt.plot(data)
    plt.title("Ritmo cardíaco: Ejemplo 1")
    plt.legend(['ritmo cardíaco'])
    plt.ylabel('pulsos')
    plt.xlabel('muestras')
    plt.show()

    # Utilizaremos la libreria scipy para detectar picos
    # https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html
    sample_rate = 100
    peaks, _ = find_peaks(data, distance=50)

    # Plotear los picos
    plt.figure()
    plt.plot(data)
    plt.plot(peaks, data[peaks], "x")
    plt.title("Ritmo cardíaco: Ejemplo 1")
    plt.legend(['ritmo cardíaco', 'pulsos'])
    plt.ylabel('pulsos')
    plt.xlabel('muestras')
    mplcursors.cursor(multiple=True)
    plt.show()

    # Calcular el ritmo cardíaco como la diferencia
    # de tiempo entre los picos
    delta_time_rate = np.diff(peaks)
    delta_time = delta_time_rate / sample_rate
    promedio = np.mean(delta_time)
    pulsaciones_por_minuto = promedio * 60
    print("Pulsaciones", pulsaciones_por_minuto)

    # Ahora veamos un ejemplo más real de uso, en donde se puede
    # ver el ruido introducido por la colocación del instrumento
    # y los movimientos del paciente.
    data, timer = hp.load_exampledata(1)
    sample_rate = hp.get_samplerate_mstimer(timer)

    plt.figure()
    peaks, _ = find_peaks(data, distance=sample_rate / 2.0)
    plt.plot(data)
    plt.plot(peaks, data[peaks], "x")
    plt.title("Ritmo cardíaco: Ejemplo 2")
    plt.legend(['ritmo cardíaco', 'pulsos'])
    plt.ylabel('pulsos')
    plt.xlabel('muestras')
    mplcursors.cursor(multiple=True)
    plt.show()

    delta_time = np.diff(peaks) / 100
    promedio = np.mean(delta_time)
    pulsaciones_por_minuto = promedio * 60
    print("Pulsaciones", pulsaciones_por_minuto)

    # Buscar picos que prevalezcan superiores a su entorno por más del tiempo
    # definido (medio ciclo de la señal) --> "prominencia"
    peaks, properties = find_peaks(data, prominence=1, width=sample_rate / 2.0)

    plt.figure()
    plt.plot(data)
    plt.plot(peaks, data[peaks], "x")
    plt.vlines(x=peaks,
               ymin=data[peaks] - properties["prominences"],
               ymax=data[peaks],
               color="C1")
    plt.hlines(y=properties["width_heights"],
               xmin=properties["left_ips"],
               xmax=properties["right_ips"],
               color="C1")
    mplcursors.cursor(multiple=True)
    plt.show()

    # Veamos ahora el potencial de heartpy
    # Autor: Paul van Gent
    # https://github.com/paulvangentcom/heartrate_analysis_python/blob/master/examples/1_regular_PPG/Analysing_a_PPG_signal.ipynb
    # Ejemplo 1
    data, timer = hp.load_exampledata(0)
    sample_rate = 100
    wd, m = hp.process(data, sample_rate=sample_rate)

    hp.plotter(wd, m)
    print("Pulsaciones", m['bpm'])

    # Ejemplo 2
    data, timer = hp.load_exampledata(1)
    sample_rate = hp.get_samplerate_mstimer(timer)
    wd, m = hp.process(data, sample_rate=sample_rate)

    hp.plotter(wd, m)
    print("Pulsaciones", m['bpm'])
예제 #9
0
        unpack=True)
    EDA_df = pd.read_csv('NodeJS/CSV/Participant{0}EDA{1}{2}.csv'.format(
        args.participantID, testType, dataType),
                         delimiter=';')

    working_data, measures = hb.process(BVP_numpy,
                                        64.0,
                                        report_time=True,
                                        calc_freq=True)
    processed_eda = nk.eda_process(EDA_df["EDA"], freq=1.9, sampling_rate=4)

    path = "BaselineData/Participant{0}/".format(args.participantID)
    if not os.path.exists(path):
        os.makedirs(path)

    hb.plotter(working_data, measures)
    print("Average heartrate(BPM): {0}".format(measures['bpm']))
    print("Average HRV(RMSSD): {0} ".format(measures['rmssd']))
    print("Average HRV(LF): {0}".format(measures['lf']))
    processed_eda["df"].plot()

    hr_dict = {}
    hr_dict['working_data'] = working_data
    hr_dict['measures'] = measures

    # Store the baseline dicts to be transported
    pickle.dump(hr_dict, open('{0}HRBase'.format(path), 'wb'))
    pickle.dump(processed_eda, open('{0}EDABase'.format(path), 'wb'))

    plt.show()
예제 #10
0
def calculate_bvp_f(bvp_data, sample_rate, bvp_time, bvp_chunks):
    features_chunks = []

    for chunk in range(len(bvp_chunks)):
        if bvp_chunks[chunk] == None:
            features_chunks.extend([None])
            continue

        bvpData = list(map(lambda x: x['data'], bvp_chunks[chunk]))
        chunk_time = bvp_chunks[chunk][-1]['timeStamp'] - bvp_chunks[chunk][0][
            'timeStamp']
        chunk_s_r = len(bvpData) / chunk_time
        if not chunk_s_r + 30 >= sample_rate:
            features_chunks.extend([None])
            continue

        bandpass = signalsTools.filter_signal(ftype='FIR',
                                              sampling_rate=chunk_s_r,
                                              band='bandpass',
                                              frequency=[0.5, 4],
                                              signal=bvpData,
                                              order=4)
        # all_working_data, all_measures = hp.process(bandpass[0], sample_rate=chunk_s_r,calc_freq=True)
        all_working_data, all_measures = hp.process(np.asarray(bvpData),
                                                    sample_rate=chunk_s_r)
        hp.plotter(all_working_data, all_measures)
        result = biosppy.signals.bvp.bvp(signal=np.asarray(bvpData),
                                         sampling_rate=chunk_s_r,
                                         show=True)
        result = fd.welch_psd(nni=np.asarray(bvpData))
        # RRI_DF = getRRI(np.asarray(bvpData), column2, sample_rate)
        # HRV_DF = getHRV(RRI_DF, np.mean(HR))
        # print(result['fft_total'])
        result.fft_plot()

        f, Pxx_den = signal.welch(np.asarray(bvpData))
        plt.semilogy(f, Pxx_den)
        plt.ylim([0.5e-3, 1])
        plt.xlabel('frequency [Hz]')
        plt.ylabel('PSD [V**2/Hz]')
        plt.show()
        plt.plot(all_working_data['RR_list'])
        plt.show()
        # features = {
        #     'HR_avg': all_measures['bpm'],
        #     'NN_avg': all_measures['ibi'],
        #     'SDNN': all_measures['sdnn'],
        #     'SDSD': all_measures['sdsd'],
        #     'RMSSD': all_measures['rmssd'],
        #     'pNN20': all_measures['pnn20'],
        #     'pNN50': all_measures['pnn50'],
        #     'hrMad': all_measures['hr_mad'],
        #     'BreR': all_measures['breathingrate'],
        #     'lf': all_measures['lf'],
        #     'hf': all_measures['hf'],
        #     'lf/hf': all_measures['lf/hf']
        # }

        time_domain_features = get_time_domain_features(
            all_working_data['RR_list'])
        freq_domain_features = get_frequency_domain_features(
            all_working_data['RR_list'])
        sampen_domain_features = get_sampen(all_working_data['RR_list'])
        features = {
            'co_he':
            freq_domain_features['total_power'] /
            (freq_domain_features['hf'] + freq_domain_features['lf'])
        }
        features.update(time_domain_features)
        features.update(freq_domain_features)
        features.update(sampen_domain_features)
        # features.update({'ApEN':get_apen(all_working_data['RR_list'], 2, (0.2 * features['SDNN']))})
        features.update({
            'ApEN':
            get_apen(all_working_data['RR_list'], 2, (0.2 * features['sdnn']))
        })

        # samp_enn = sampen2(all_working_data['RR_list'])
        # features['sampEn'] = samp_enn['sampen']

        SD1 = (1 / np.sqrt(2)) * features[
            'sdsd']  # measures the width of poincare cloud https://github.com/pickus91/HRV/blob/master/poincare.py
        SD2 = np.sqrt(
            (2 * features['sdnn']**2) -
            (0.5 *
             features['sdsd']**2))  # measures the length of the poincare cloud
        features['SD1'] = SD1
        features['SD2'] = SD2
        features_chunks.extend([features])

    return features_chunks