def vop_seg_derivada(tiempo_ecg, ecg, tiempo_pulso1, pulso1, tiempo_pulso2, pulso2, distancia): #~~~~~~~~~~~~~~~~~~~~~~~~~Senales ECG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ coef_num = 51 f_cut = 0.034 # Frecuencia de corte 60 Hz coef = signal.firwin(coef_num, f_cut, window='hamming',nyq=1800) f_ecg = window_filtering.Filter(ecg, coef_num, coef); # Identificación de puntos de la Onda ECG: pos_ecg = maximos_ecg(f_ecg) #~~~~~~~~~~~~~~~~~~~~Senal de pulso 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ coef_num = 15 f_cut = 0.01875 coef = signal.firwin(coef_num, f_cut, window='hamming',nyq=900) f_pulso1 = window_filtering.Filter(pulso1, coef_num, coef); # Identificación de los puntos de la onda de pulso1 pos_pulso1 = seg_derivada_maxima(tiempo_pulso1, f_pulso1, tiempo_ecg[pos_ecg]) #~~~~~~~~~~~~~~~~~~~~Senal de pulso 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ f_pulso2 = window_filtering.Filter(pulso2, coef_num, coef); # Identificación de los puntos de la onda de pulso1 pos_pulso2 = seg_derivada_maxima(tiempo_pulso2, f_pulso2, tiempo_ecg[pos_ecg]) # Cálculo del tiempo de tránsito: tt = transit_time(tiempo_ecg[pos_ecg], tiempo_pulso1[pos_pulso1], tiempo_pulso2[pos_pulso2]) vop = [] for k in tt: vop.append(distancia / k) vop = np.array(vop) return f_ecg, f_pulso1, f_pulso2, pos_ecg, pos_pulso1, pos_pulso2, vop
def firFilter(self, cutoff=50, numtaps=31, pass_zero=True, fs=1800): """"This module process the signal with a low pass fir filter (hamming window). :param cutoff Cut off frequency in Hz. :param numtaps Number of coeficients of the fir filter :param pass_zero Should be always True for being a low pass filter :param fs Sampling frecuency in Hz. """ # Calculating nyquist frequency, also know as folding frequency: nyq = int(fs / 2) # Scaling the cutoff frequency to the nyquist frequency: if type(cutoff) == type([]): cutoff = [(float(c) / nyq) for c in cutoff] else: cutoff = cutoff / float(nyq) # Fir coeficient generation: ventana = signal.firwin(numtaps=numtaps, cutoff=cutoff, pass_zero=pass_zero, nyq=1) # Sinal filtering: self.ecg = window_filtering.Filter(self.ecg, numtaps, ventana) return self
def seg_derivada_maxima(tiempos_original, original, tiempos_ecg): # Procesando la señal de pulso a una frecuencia de 20 Hz coef_num = 15 f_cut = 0.0111 delay = (coef_num - 1)/2 deriv_p = signal.firwin(coef_num, f_cut, window='hamming',nyq=1800) f_orig = window_filtering.Filter(original, coef_num, deriv_p); #~~~~~~~~~~~~~~~~~~~~~Primera derivada~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Se deriva la señal para obtener la primera derivada: pri_deriv = np.diff(original) coef_num = 21 f_cut = 0.1 deriv_p = signal.firwin(coef_num, f_cut, window='hamming',nyq=800) f_pri_deriv = window_filtering.Filter(pri_deriv, coef_num, deriv_p); #~~~~~~~~~~~~~~~~~~~~~Segunda derivada~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ seg_deriv = np.diff(f_pri_deriv) f_seg_deriv = window_filtering.Filter(seg_deriv, coef_num, deriv_p); ## Identificación de los puntos de la onda de pulso2: posPuntMaxP1 = maximos_num(tiempos_original, f_seg_deriv, tiempos_ecg) #return posPuntMaxP1, puntMaxP1, f_orig, pri_deriv, f_pri_deriv puntMaxP1 = f_seg_deriv[posPuntMaxP1] rangTol = 0.3 valMin = np.median(puntMaxP1) * (1 - rangTol) valMax = np.median(puntMaxP1) * (rangTol + 1) # Ubicando los puntos que no están en el rango de tolerancia: eliPuntos = np.where( (puntMaxP1 <= valMin) | (puntMaxP1 >= valMax) ) # Eliminando puntos y sus posiciones fuera del rango: puntMaxP1 = np.delete(puntMaxP1, eliPuntos) posPuntMaxP1 = np.delete(posPuntMaxP1, eliPuntos) intPosPuntosMax = [] for x in posPuntMaxP1: intPosPuntosMax.append(int(x)) return intPosPuntosMax
def __firFilter(self, signal1, numtaps, cutoff, pass_zero, nyq): ventana = signal.firwin(numtaps=numtaps, cutoff=cutoff, pass_zero=pass_zero, nyq=nyq) return window_filtering.Filter(signal1, numtaps, ventana)