Пример #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 process_ecg(self):
        """Runs heartpy.process on up-sampled data and creates a timestamp for each detected beat"""

        print("\n" + "Detecting peaks using the HeartPy algorithm...")

        # Upsamples data by a factor of 4 to improve peak index resolution
        self.ecg_resampled = resample(
            self.ecg_filtered,
            len(self.ecg_filtered) * self.resample_factor)

        self.ecg_scaled = heartpy.scale_data(
            [float(i) for i in self.ecg_resampled])

        # Processes data using standard heartpy processing
        self.wd, self.summary = heartpy.process(
            hrdata=self.ecg_scaled,
            sample_rate=self.signal_frequency * self.resample_factor)

        # Retrieves peaks that got removed in check process
        for peak in self.wd["peaklist"]:
            if peak not in self.wd["peaklist_cor"]:
                self.corrected_peaks.append(peak)

        # Creates a timestamp for every beat using peak indexes
        for peak in self.wd["peaklist_cor"]:
            self.beat_timestamps.append(self.starttime + timedelta(
                seconds=peak / (self.signal_frequency * self.resample_factor)))

        print("Peak detection complete.")
Пример #3
0
def resamples(data, filtered, sample_rate):
    """
    функция для нормализации сигнала
    :param data: исходные данные
    :param filtered: отфильтрованный сигнал
    :param sample_rate: шаг
    :return: wd -содержит пары пиков и множество других характеристик сигнала, m - статистика по сигналу
    """

    resampled_data = resample(data, len(filtered))
    #scale_data - функция, которая масштабирует передаваемые данные так, чтобы они указали границы
    #в любом другом исполнении не работает
    print(hp.scale_data(resampled_data))
    wd, m = hp.process(hp.scale_data(resampled_data), sample_rate * 2)
    # plt.figure(figsize=(12, 4))
    # hp.plotter(wd, m)

    return wd, m
Пример #4
0
def get_bpm(ecg_signal, sample_rate):
    """
    calculate bpm filtering the signal and upsampling it for better results
    :param ecg_signal: 1 lead from an ecg
    :param sample_rate: the sample rate of the ecg
    :param start_at: this defines the start portion of the ecg that you want to analyse
    :param finish_at: this defines the end portion of the ecg that you want to analyse
    :return: the bpm for the given sequence
    """
    upsampled = scipy.signal.resample(ecg_signal, len(ecg_signal) * 4)
    wd, m = hp.process(hp.scale_data(upsampled), sample_rate * 4)

    for measure in m.keys():
        if measure == 'bpm':
            return m[measure]
Пример #5
0
def wave_slicing(sig_data, pre_num, after_num, fs, slices_num):
    data_length = slices_num *(pre_num + after_num)
    if sig_data.shape[0] < data_length :
      print('data is less than ', data_length )
      return np.array()
    sig_data = denoise(sig_data[0:data_length])
    #print('sig_data shape',sig_data.shape)
    #print(sig_data)
  

    data_scale = hp.scale_data(sig_data)
    record_sliced = []
    try:
      # get the location of R wave
      working_data, measures = hp.process(hrdata= data_scale,
                                            sample_rate = fs,
                                            bpmmin=5, bpmmax= 300)
      # 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 , '\n len(peaklists):', len(peaklists))

      # get the wave
      for i in peaklists[0:slices_num]:
        #print(i)
        tem_data = data_scale[i - pre_num: i + after_num]
        #print('sliced data shape', tem_data.shape)
        #print('tem_data type:', type(tem_data))
        record_sliced.append(tem_data)
        #print('append tem_data')

      #plot sample
      #plt.plot(record_sliced[-1])
      #title = str(peaklists[-1])
      #plt.title(title)
      #plt.show()

      record_sliced = np.array(record_sliced).T

      print('record_sliced shape:',record_sliced.shape)
    
    except Exception as e:
      print('error:', e)

    return record_sliced
Пример #6
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
Пример #8
0
from keras.callbacks import ReduceLROnPlateau
from keras.constraints import max_norm
from sklearn.model_selection import train_test_split
import pywt
import datetime

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