Exemplo n.º 1
0
def calculate_hr(signal_data, timestamps=None):
    sampling_rate = 47.63
    if timestamps is not None:
        sampling_rate = hp.get_samplerate_mstimer(timestamps)
        try:
            wd, m = hp.process(signal_data, sample_rate=sampling_rate)
            hr_bpm = m["bpm"]
        except:
            hr_bpm = 75.0

        if np.isnan(hr_bpm):
            hr_bpm = 75.0
        return hr_bpm

    else:
        # We are working with predicted HR:
        # need to filter and do other stuff.. lets see
        signal_data = hp.filter_signal(signal_data,
                                       cutoff=[0.7, 2.5],
                                       sample_rate=sampling_rate,
                                       order=6,
                                       filtertype='bandpass')
        try:
            wd, m = hp.process(signal_data,
                               sample_rate=sampling_rate,
                               high_precision=True,
                               clean_rr=True)
            hr_bpm = m["bpm"]
        except:
            print(
                "BadSignal received (could not be filtered) using def HR value = 75bpm"
            )
            hr_bpm = 75.0
        return hr_bpm
Exemplo n.º 2
0
def filter_and_resample_truth_signal(signal_df, resampling_size):
    # Signal should be bandpass filtered to remove noise outside of expected HR frequency range.
    # But we are using CLEANER_PPG signals which are considered filtered.
    orignal_sample_rate = hp.get_samplerate_mstimer(signal_df["Time"].values)

    # filtered = hp.filter_signal(signal_df["Signal"].values, [0.7, 2.5], sample_rate=sample_rate,
    #                             order=3, filtertype='bandpass')
    resampled_signal = signal.resample(signal_df["Signal"].values,
                                       resampling_size,
                                       t=signal_df["Time"].values)

    # we'll need to add resampled[1]
    return resampled_signal[0], resampled_signal[1]
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'])
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')
Exemplo n.º 5
0
import serial
import numpy as np
import heartpy as hp
import matplotlib
import csv
import pprint
from hrvanalysis import *

file = "samples/example.csv"

print("\nLoading sample data from", file + "\n")
data = np.loadtxt(file, delimiter=",", skiprows=(1), usecols=[1])
timer = np.loadtxt(file, delimiter=",", skiprows=(1), usecols=[0])
timer = timer*1000
fp = hp.get_samplerate_mstimer(timer)
print("Detected sampling frequency of", str(round(fp, 2)), "hertz.\n")
print("Preprocessing ECG data.\n")
data = hp.preprocess_ecg(data, fp)
print("Processing resulting data through heartpy.\n")
working_data, measures = hp.process(
    data, fp*2, reject_segmentwise=True, calc_freq=True)
print("Resulting measures (heartpy):\n")
pprint.pprint(measures)
print("\nProcessing heartpy's data using hrvanalysis.\n")
rrintervals = working_data["RR_list_cor"]

rrintervalswo = remove_outliers(rr_intervals=rrintervals,
                                low_rri=300, high_rri=2000)

intervals = interpolate_nan_values(rr_intervals=rrintervalswo,
                                   interpolation_method="linear")