Académique Documents
Professionnel Documents
Culture Documents
Alison Guzmán
Se proporciona una señal ECG de un paciente X de 40 años, la cual fue adquirida a una
frecuencia de muestreo de 600 HZ.
W = fftfreq(señal.size)
f_signal = rfft(señal)
fcseñal = ((f_signal)).copy()
fcseñal[(W<0.0)]=0
fcseñal[W>0.05]=0
filtrada = irfft((fcseñal))
plt.plot(tiempos,filtrada,"orange")
plt.grid(True)
plt.title("Señal filtrada")
plt.xlabel("tiempo[s]")
plt.ylabel("señal ecg")
plt.show()
cut_f_signal=rfft((filtrada))
plt.plot(W,cut_f_signal,"purple")
plt.grid(True)
plt.title("FFT filtrada")
plt.xlabel("frecuencia fourier")
plt.ylabel("fft")
plt.show()
1-Al observar la señal se ve claramente que hay 8 ciclos de la señal ECG. Grafique en una
sola celda de 2x2 los primeros 4 ciclos de la señal en 4 gráficos diferentes. Trate de usar las
propiedades vistas en clase colocando cada título y viñeta.
En la señal se puede visualizar con claridad el número de ciclos que es 8 sabemos que el
ultimo valor de tiempo es 6.826...[s] por lo que cada ciclo tiene un tiempo de 6.826../8 lo
cual da 0.85[s] eso es lo que dura una palpitación de nuestro paciente, lo que llame en el
código duración ciclo luego, trabajo con un for de 0 a 4, ya que hay que graficar los
primeros 4 ciclos se define un lim inf y un lim sup estos van variando con las iteraciones del
for, mi lim inf se ira moviendo en los valores de la señal al igual que mi lim sup ellos
cambiaran según el ciclo donde este ejemplo: en el primer ciclo lim inf será 0 lim sup =
1*duración ciclo=0.85, en el siguiente el lim inf pasara a ser mi anterior lim inf y mi lim sup
será 2*duración ciclo =1.7 luego, creo otro for que vaya en el len de tiempos si mi tiempo
está dentro del lim inf y lim sup lo ingreso a una lista x y el valor de la señal de ese tiempo
lo ingreso a la lista y luego aplico subplot (valor fila, valor columna, numero de gráfico en el
que estoy) el ultimo valor de mi subplot varia con respecto al número de ciclo que se está
graficando gráfico con un plot la listax con la lista y gráfico con plt.show().
Código:
plt.figure(figsize=(15,15))
duracionciclo=tf/8 #duracion 1 palpitacion
for i in range(0,4):
liminf=i*duracionciclo
limsup=(i+1)*duracionciclo
listax=[]
listay=[]
for j in range(len(tiempos)):
plt.subplot(2,2,(i+1))
plt.title("Ciclo "+str(i+1),fontsize=17)
plt.plot(listax,listay,"magenta")
plt.xlabel("tiempo[s]",fontsize=15)
plt.ylabel("señal ecg",fontsize=15)
plt.grid(True)
plt.show()
Imagen 1: Se pueden visualizar los primeros 4 ciclos de la señal de ecg de nuestro paciente.
2-La frecuencia cardíaca normal en un paciente es de 60/latidos por minuto. Determine la
frecuencia cardiaca del paciente X con los datos de la señal que se le proporcionan. (Utilice
la fórmula de frecuencia de muestreo)
la frecuencia cardíaca es el número de ciclos en un minuto, ya se sabe que el tf =6.826...y
que en ese tiempo hay 8 ciclos podríamos con estos valores calcular la frecuencia hacer una
regla de tres simple y calcular la frecuencia cardíaca, pero para realizar este ejercicio se
debe partir desde el punto de que no se sabe cuál es la cantidad de ciclos en la señal que
nos dan , por esto utilice un método matemático aprendido en el ramo "Métodos
numéricos" muy utilizado para calcular la frecuencia cardíaca el cual es el análisis de
ventanas el cual consiste en calcular los máximos móviles en ventanas el tamaño de estas
ventana lo llamo b mientras más pequeño sea b calculara más máximos ya que la ventana
será más pequeña significa que no encontrare los reales máximos que me interesan que
son los que están en el punto máximo de la onda r si no los máximos pequeños que están
bajo esos máximos que si interesan, es por esto que el valor de b se aumenta hasta que se
generen ventanas del tamaño de un ciclo para que por cada ciclo se encuentre su máximo
el cual corresponde a la onda R, una vez obtenidos los máximos los cuento con una
sumatoria simple de 1 cada vez mi cantidad de máximos es mi cantidad de ciclos, por lo que
con esto ya se obtuvo algorítmicamente el número de ciclos que hay en 6.826..[s] que es el
tiempo en que se tomó el ecg a nuestro paciente luego podemos utilizar la regla de 3:
en 6.826... [s] hay 8 palpitaciones cuantas palpitaciones hay en 60 [s]?
(60*8) /6.826... en el código 8=máximos y 6.826...=tf
con esta fórmula se obtiene que la frecuencia cardiaca es 70.3125, es decir en un minuto
hay 70.3125 palpitaciones aproximando 70 palpitaciones.
Código:
import numpy as np
import matplotlib.pyplot as plt
#Analisis de ventana
b=180
for j in range(b,n-b):
es_maximo=True
for i in range(-b,b+1):
if filtrada[j]<filtrada[j+i]:
es_maximo=False
if es_maximo==True:
maximos_movil[j]=filtrada[j]
t.append(j*0.01)
maximos=maximos+1
plt.plot(filtrada,"orange",label="señal")
plt.plot(maximos_movil,"red",label="Máximos")
plt.grid(True)
plt.title("Señal filtrada y máximos móviles")
plt.legend()
plt.xlabel("tiempo[s]")
plt.ylabel("señal ecg")
plt.show()
Imagen 2: Se puede visualizar en color naranjo la señal ecg y en color rojo los máximos.
3- La señal ECG está compuesta por el complejo QRS. Obtener las posiciones del tiempo de
la señal (tiempo en segundos) donde aparecen las ondas R de cada ciclo. (Usar indexado de
vectores visto en clases)
Al obtener en el anterior código los máximos de la señal ya poseo el valor de la onda R con
ello puedo trabajar para encontrar el tiempo donde se encuentra el valor de la onda R en el
inicio del código hago algo muy parecido al código en el que grafico los primeros 4 ciclos
parto por un for pero en esta ocasión ira de 0 a máximos y máximos es 8,ya que es el
número de ciclos de la señal también hare un lim inf ,lim sup luego una lista x e y etc...
mis R serán los máximos de mi listay ya que mi listay son los valores de los ciclos con index
encuentro la posición en la que se encuentra los R luego esas posiciones las marque en el
grafico con color magenta luego con el valor de la posición que se obtuvo obtengo en la
lista de tiempos el valor ubicado en esa posición y ese será el valor de tiempo en el que se
ubica la onda R.
Código:
duracionciclo=tf/maximos #duracion 1 palpitacion
rx=[]
ry=[]
for i in range(0,maximos):
liminf=i*duracionciclo
limsup=(i+1)*duracionciclo
listax=[]
listay=[]
for j in range(len(tiempos)):
R=max(listay)
posicion=listay.index(R)
plt.scatter(listax[posicion],listay[posicion],s=100,c="magenta")
plt.plot(listax,listay,"cyan")
tiempoR=[]
tiempo=listax[posicion]
tiempoR.append(tiempo)
for a in tiempoR:
timee=a
print("El tiempo en que se ubica la onda R en el ciclo",(i+1),"es: ",round(timee,2),"[s]")
plt.show()
Imagen 3: Se puede visualizar en color cyan la señal ecg y los círculos magenta marcan la onda R.