예제 #1
0
 def process(self):
     rpeaks = bioecg.ecg(np.ravel(self.record),
                         show=False,
                         sampling_rate=self.fs)
     median_rr = self.calculate_rr(rpeaks)
     cycles = self.segment_cycles(rpeaks, median_rr)
     return rpeaks, median_rr, cycles
예제 #2
0
def get_rpeaks(ecg_df, fs):
    rpeaks_window = float(fs) * WINDOW_SIZE
    rpeaks = []
    clean_rpeaks = []
    for lead_id in LEADS:
        record = ecg_df[lead_id].values
        ecg_info = ecg.ecg(record, sampling_rate=fs, show=False)
        ecg_rpeaks = ecg_info['rpeaks']
        rpeaks.extend(ecg_rpeaks.tolist())
    
    rpeaks = sorted(rpeaks)
    rpeaks_area_counter = []
    for current_rpreak in rpeaks:
        counter=0
        for rpreak in rpeaks:
            if abs(rpreak - current_rpreak) < rpeaks_window:
                counter+=1
        rpeaks_area_counter.append(counter)
    rpeaks_area_counter = np.array(rpeaks_area_counter)
    good_peaks_ids = np.where(rpeaks_area_counter >= 2)[0]
    rpeaks = np.array(rpeaks)
    good_rpeaks = rpeaks[good_peaks_ids]
    
    clean_rpeaks.append(good_rpeaks[0])
    for rpeak_id in range(1, good_rpeaks.shape[0]):
        if abs(good_rpeaks[rpeak_id] - clean_rpeaks[-1]) > rpeaks_window:
            clean_rpeaks.append(good_rpeaks[rpeak_id])

    return np.array(clean_rpeaks)    
예제 #3
0
def get_pulse2(ecgin):
    bf = sig.butter(5, [0.1, 10], btype='bandpass', fs=256, output='sos')
    out1 = ecg.ecg(signal=ecgin, sampling_rate=256)
    # out2 = ecg.ecg(signal=sig.sosfilt(bf, ecgin), sampling_rate=256)
    pp.plot(out1['heart_rate_ts'], out1['heart_rate'])
    # pp.plot(out2['heart_rate_ts'], out2['heart_rate'])
    pp.show()
    print(out1['heart_rate_ts'][1:]-out1['heart_rate_ts'][:-1])
예제 #4
0
def transform_ecg(signal, sampling_rate=SAMPLING_RATE, verbose=False):
    signal = signal[~np.isnan(signal)]
    X = list()
    ts, filtered, rpeaks, templates_ts, templates, heart_rate_ts, heart_rate = ecg.ecg(
        signal, sampling_rate, show=verbose)
    rpeaks = ecg.correct_rpeaks(signal=signal,
                                rpeaks=rpeaks,
                                sampling_rate=sampling_rate,
                                tol=0.1)

    peaks = signal[rpeaks]
    if len(heart_rate) < 2:
        heart_rate = [0, 1]
    if len(heart_rate_ts) < 2:
        heart_rate_ts = [0, 1]

    X.append(np.mean(peaks))
    X.append(np.min(peaks))
    X.append(np.max(peaks))
    X.append(np.mean(np.diff(rpeaks)))
    X.append(np.min(np.diff(rpeaks)))
    X.append(np.max(np.diff(rpeaks)))
    X.append(np.mean(heart_rate))
    X.append(np.min(heart_rate))
    X.append(np.max(heart_rate))
    X.append(np.mean(np.diff(heart_rate)))
    X.append(np.min(np.diff(heart_rate)))
    X.append(np.max(np.diff(heart_rate)))
    X.append(np.mean(np.diff(heart_rate_ts)))
    X.append(np.min(np.diff(heart_rate_ts)))
    X.append(np.min(np.diff(heart_rate_ts)))
    X.append(np.max(np.diff(heart_rate_ts)))
    X.append(np.sum(filtered - signal))

    X += list(np.mean(templates, axis=0))
    X += list(np.min(templates, axis=0))
    X += list(np.max(templates, axis=0))
    X = np.array(X)

    X[np.isnan(X)] = 0
    return np.array(X)
예제 #5
0
파일: filter.py 프로젝트: Gagampy/ecg_class
 def process(self):
     out_tuple = bioecg.ecg(np.ravel(self.record),
                            show=False,
                            sampling_rate=self.fs)
     return out_tuple['filtered']
def get_pulse(ecgin):
    out = ecg.ecg(signal=ecgin, sampling_rate=256, show=False)
    return out
예제 #7
0
def extract_ecg_features(ecgFile, ecgFeatFile, freq, stage, winSize, shift):
    threshold = 0.2  # threshold for invalid window Ex) 0.2 represents 20%
    numOfFeatures = 8
    windowList = []
    window_begin = -1
    invalid_cnt = 0
    valid_cnt = 0
    firstTime = -1
    firstRead = 0
    while True:
        line = ecgFile.readline()  # 라인 by 라인으로 데이터 읽어오기
        if not line:
            # print(" End Of Zep ECG File")
            break
        lineData = [x.strip() for x in line.split(',')]  # 데이터 한 줄을 리스트로 변환
        currentTime = float(lineData[0])
        if firstRead == 0:
            firstTime = currentTime
            firstRead = 1

        if firstTime + shift <= currentTime:
            if window_begin == -1:
                window_begin = currentTime
            if lineData[1] != '':
                windowList.append(float(lineData[1]))
                valid_cnt += 1
            else:
                invalid_cnt += 1

            if currentTime - window_begin >= winSize:
                features = []
                if invalid_cnt <= (
                    (winSize * freq) * threshold):  # valid window
                    try:
                        window = ecg.ecg(signal=windowList,
                                         sampling_rate=freq,
                                         show=False)
                    except ValueError:
                        for i in range(0, numOfFeatures):
                            features.append('n\t')
                    else:
                        # Calculate RR intervals
                        rrList = []
                        for i in range(1, len(window[2])):
                            rr = window[0][window[2][i]] - window[0][window[2][
                                i - 1]]
                            rrList.append(rr)

                        # Calculate RMSSD that is heart rate variability (HRV)
                        hrvList = [0]
                        if rrList:
                            if len(rrList) > 1:
                                hrvList = []
                                for y in range(len(rrList) - 1):
                                    hrvList.append(
                                        (rrList[y + 1] - rrList[y]) *
                                        (rrList[y + 1] - rrList[y]))
                        try:
                            freqDomFeat = frequencyDomain(rrList,
                                                          band_type=None,
                                                          lf_bw=0.11,
                                                          hf_bw=0.1,
                                                          plot=0)
                        except ValueError:
                            freqDomFeat = [0, 0, 0, 0]

                        # min-per20-med-per80-max-mean-std-hrv
                        # vlfe-lfe-hfe-lfhfr
                        features.append(
                            str(np.min(rrList)) + "\t" +
                            str(np.percentile(rrList, 20)) + "\t" +
                            str(np.median(rrList)) + "\t" +
                            str(np.percentile(rrList, 80)) + "\t" +
                            str(np.max(rrList)) + "\t" + str(np.mean(rrList)) +
                            "\t" + str(np.std(rrList)) + "\t" +
                            str(np.sqrt(np.average(hrvList))) + "\t")
                        # + "\t" + str(freqDomFeat[0]) + "\t" + str(freqDomFeat[1]) + "\t" + str(freqDomFeat[2]) + "\t" + str(freqDomFeat[3])
                else:  # equal to or more than 20% error? no features. that is invalid window
                    for i in range(0, numOfFeatures):
                        features.append('n\t')
                features.append(stage + '\n')
                ecgFeatFile.write(''.join(features))

                windowList = []
                window_begin = -1
                valid_cnt = 0
                invalid_cnt = 0
예제 #8
0
print('X_t shape: ' + str(X_t.shape))
print('y_t shape: ' + str(y_t.shape))

loaded_model = load_model('autoencoder.h5')

encoder = Model(loaded_model.input,
                loaded_model.layers[-3].input)  # Input(shape=(180,))

encoded_matrix = []

for row in X_t:
    decomposed_row = np.empty([1, 180])  # initializing meaningless line
    row = pd.Series(row)
    row = row.dropna().values
    _, _, _, _, templates, _, _ = ecg.ecg(signal=row,
                                          sampling_rate=300.0,
                                          show=False)
    decomposed_row = np.concatenate((decomposed_row, templates), axis=0)
    decomposed_row = decomposed_row[1:]  # removing meaningless line
    decomposed_encoded_row = []
    for beat in decomposed_row:
        decomposed_encoded_row.append(encoder.predict(np.array([beat]))[0])
    encoded_matrix.append(np.array(decomposed_encoded_row))

encoded_matrix = np.array(encoded_matrix)
print(encoded_matrix.shape)
print('Computed encoded matrix')

X_train, X_test, y_train, y_test = train_test_split(encoded_matrix,
                                                    y_t,
                                                    test_size=0.2)
예제 #9
0
import matplotlib as ml
import matplotlib.pyplot as plt


#bdfRec = bdfRecording("../Dataset/Sessions/789/Part_7_N_Trial5_emotion.bdf")
bdfRec = bdfRecording("789/Part_7_N_Trial5_emotion.bdf")
ECG_idx = bdfRec.dataChanLabels.index('EXG2')
rec = bdfRec.getData(channels=[ECG_idx])
sampling_rate = bdfRec.sampRate[ECG_idx]
signal = np.array(rec['data'][0])
rec_s = pd.Series(rec['data'][0])
rec_s.plot()
pyplot.pause(0.1)

hr = ecg.ecg(signal=signal, sampling_rate=sampling_rate, show=False)[6]

#Must figure out a better way to find the time table.
#Video is 22 seconds and there is 85 samples
#video_duration = 22
#step = video_duration/float(len(hr))

step = 1/(float(sampling_rate)/60)
length = len(hr)
video_duration = step * float(len(hr))
time_array = np.arange(0, video_duration, step)

time_array_len = len(time_array)

combined = np.vstack((time_array, hr)).T
np.savetxt("ecg.csv", combined, delimiter=",")