Source code for vital_sqi.preprocess.preprocess_signal

import numpy as np
from scipy import signal

[docs]def tapering(signal_data,window=None): """ expose Pin the leftmost and rightmost signal to the zero baseline and amplify the remainder according to the window shape :param signal_data: list, :param window:sequence, array of floats indicates the windows types as described in scipy.windows :return: the tapered signal """ signal_data = signal_data-np.min(signal_data) if window == None: window = signal.windows.tukey(len(signal_data),0.9) signal_data_tapered = np.array(window) * (signal_data) return np.array(signal_data_tapered)
[docs]def smooth(x,window_len=5,window='flat'): """ expose :param x: :param window_len: :param window: :return: """ x = np.array(x) if x.ndim != 1: raise(ValueError, "smooth only accepts 1 dimension arrays.") if x.size < window_len: raise(ValueError, "Input vector needs to be bigger than window size.") if window_len < 3: return x if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']: raise(ValueError, "Window is on of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'") s = np.r_[x[window_len - 1:0:-1], x, x[-2:-window_len - 1:-1]] # print(len(s)) if window == 'flat': # moving average w = np.ones(window_len, 'd') else: w = eval('np.' + window + '(window_len)') # y = np.convolve(w / w.sum(), s, mode='valid') y = np.convolve(w / w.sum(), x, mode='same') return y
[docs]def scale_pattern(s,window_size): """ expose :param s: :param window_size: :return: """ scale_res = [] if len(s) == window_size: return np.array(s) if len(s)<window_size: #spanning the signal span_ratio = (window_size/len(s)) for idx in range(0,int(window_size)): if idx-span_ratio<0: scale_res.append(s[0]) else: scale_res.append(np.mean(s[int(idx/span_ratio)])) else: scale_res = squeeze_template(s, window_size) # scale_res = smooth_window(scale_res, span_size=5) # scale_res = smooth(scale_res, span_size=5) smmoothed_scale_res = smooth(scale_res) return np.array(smmoothed_scale_res)
[docs]def squeeze_template(s,width): """ handy :param s: :param width: :return: """ s = np.array(s) total_len = len(s) span_unit = 2 out_res = [] for i in range(int(width)): if i == 0: centroid = (total_len/width)*i else: centroid = (total_len/width)*i left_point = int(centroid)-span_unit right_point = int(centroid+span_unit) if left_point <0: left_point=0 if right_point >len(s): left_point=len(s) out_res.append(np.mean(s[left_point:right_point])) return np.array(out_res)