Vous êtes sur la page 1sur 8

Tarea 1 laboratorio de electromedicina 3

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.

filtrado de la señal para eliminar ruido

Código: La señal de ecg tiene 4096 valores de voltaje no se


nos entrega el tiempo en el que se obtuvo cada
import matplotlib.pyplot as plt
valor de voltaje, pero si la frecuencia de muestreo
import numpy as np
de la señal y esta es de 600hz con este dato
from scipy.fftpack import rfft, irfft, fftfreq podemos obtener los valores de tiempo ya que con
esta frecuencia se puede calcular el periodo el cual
fs=600 será 1/600, teniendo el periodo y usando lo visto en
archivo=np.loadtxt("ecg.txt",unpack=True) Análisis de sistemas y Procesamiento de señales al
muestrear una señal se pasa de tiempo continuo a
discreto para poder hacer esta conversión el valor
periodomuestreo=1/fs
de tiempo (t) se iguala a n*T con T el periodo y n el
ti=0*periodomuestreo número de muestras ya sabemos que el número de
tf=len(archivo)*periodomuestreo muestras de nuestra señal es 4096 entonces
tiempos=np.linspace(ti,tf,len(archivo)) podemos obtener el valor inicial de tiempo con n=0
señal = archivo
y T=1/600 lo que da un t=0 [s] y el valor final de
tiempo con n=4096 y T=1/600 da un t=6.826..[s]
luego con un linspace que es (valor inicial, valor
plt.plot(tiempos,señal,"yellow")
final, numero de muestras en el intervalo valor
plt.grid(True) inicial a valor final), podemos obtener la lista de
plt.title("Señal ruidosa") tiempos de la señal para poder así graficarla y
plt.xlabel("tiempo[s]") trabajarla luego la señal posee ruido, el cual le
eliminaremos mediante un filtro para poder ver
plt.ylabel("señal ecg")
cuáles son las frecuencias que se deben eliminar se
plt.show()
aplica Fourier a la señal luego las frecuencias
parasitas se filtran obteniendo la Fourier filtrada de
FFT=rfft(archivo) la señal y luego calculando la inversa volvemos a la
ff=fftfreq(len(tiempos),1/fs) señal en dominio del tiempo con su filtro ya
realizado se puede apreciar más claramente las
diferentes ondas que componen la señal de ecg.
plt.plot(ff,FFT,"violet")
plt.grid(True)
plt.title("FFT antes del filtro")
plt.xlabel("frecuencia fourier")
plt.ylabel("fft")
plt.show()

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)):

if tiempos[j]>=liminf and tiempos[j]<limsup:


listax.append(tiempos[j])
listay.append(filtrada[j])

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

t=[] #lista que almacena los tiempos de cada maximo


maximos=0
n=len(filtrada)
maximos_movil=np.zeros(n)

#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

print("Número de ciclos en",tf,": ",maximos)


PPM=(maximos*60)/tf
print("Número de ciclos en 60seg: ",(PPM))

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()

Número de ciclos en 6.826666666666667 : 8


Número de ciclos en 60seg: 70.3125

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)):

if tiempos[j]>=liminf and tiempos[j]<limsup:


listax.append(tiempos[j])
listay.append(filtrada[j])

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.title("Detección de onda R")


plt.xlabel("tiempo[s]")
plt.ylabel("señal ecg")

plt.show()

El tiempo en que se ubica la onda R en el ciclo 1 es: 0.31 [s]


El tiempo en que se ubica la onda R en el ciclo 2 es: 1.17 [s]
El tiempo en que se ubica la onda R en el ciclo 3 es: 2.02 [s]
El tiempo en que se ubica la onda R en el ciclo 4 es: 2.87 [s]
El tiempo en que se ubica la onda R en el ciclo 5 es: 3.73 [s]
El tiempo en que se ubica la onda R en el ciclo 6 es: 4.58 [s]
El tiempo en que se ubica la onda R en el ciclo 7 es: 5.43 [s]
El tiempo en que se ubica la onda R en el ciclo 8 es: 6.29 [s]

Imagen 3: Se puede visualizar en color cyan la señal ecg y los círculos magenta marcan la onda R.

Vous aimerez peut-être aussi