algorithm language-agnostic machine-learning signal-processing pattern-recognition

algorithm - Detectando patrones en ondas



language-agnostic machine-learning (18)

Intento leer una imagen de un electrocardiograma y detectar cada una de las ondas principales en él (onda P, complejo QRS y onda T). Ahora puedo leer la imagen y obtener un vector como (4.2; 4.4; 4.9; 4.7; ...) representativo de los valores en la electrocardiografía, ¿cuál es la mitad del problema? Necesito un algoritmo que pueda atravesar este vector y detectar cuándo comienza y finaliza cada una de estas ondas.

Aquí hay un ejemplo de uno de sus gráficos:

Sería fácil si siempre tuvieran el mismo tamaño, pero no funciona, o si sabía cuántas ondas tendría el ecg, pero también puede variar. ¿Alguien tiene algunas ideas?

¡Gracias!

Actualizando

Ejemplo de lo que estoy tratando de lograr:

Dada la ola

Puedo extraer el vector

[0; 0; 20; 20; 20; 19; 18; 17; 17; 17; 17; 17; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; 17; 17; 18; 19; 20; 21; 22; 23; 23; 23; 25; 25; 23; 22; 20; 19; 17; dieciséis; dieciséis; 14; 13; 14; 13; 13; 12; 12; 12; 12; 12; 11; 11; 10; 12; dieciséis; 22; 31; 38; 45; 51; 47; 41; 33; 26; 21; 17; 17; dieciséis; dieciséis; 15; dieciséis; 17; 17; 18; 18; 17; 18; 18; 18; 18; 18; 18; 18; 17; 17; 18; 19; 18; 18; 19; 19; 19; 19; 20; 20; 19; 20; 22; 24; 24; 25; 26; 27; 28; 29; 30; 31; 31; 31; 32; 32; 32; 31; 29; 28; 26; 24; 22; 20; 20; 19; 18; 18; 17; 17; dieciséis; dieciséis; 15; 15; dieciséis; 15; 15; 15; 15; 15; 15; 15; 15; 15; 14; 15; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; 15; dieciséis; 15; 15; 15; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; 15; dieciséis; dieciséis; dieciséis; dieciséis; dieciséis; 15; 15; 15; 15; 15; dieciséis; dieciséis; 17; 18; 18; 19; 19; 19; 20; 21; 22; 22; 22; 22; 21; 20; 18; 17; 17; 15; 15; 14; 14; 13; 13; 14; 13; 13; 13; 12; 12; 12; 12; 13; 18; 23; 30; 38; 47; 51; 44; 39; 31; 24; 18; dieciséis; 15; 15; 15; 15; 15; 15; dieciséis; dieciséis; dieciséis; 17; dieciséis; dieciséis; 17; 17; dieciséis; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; dieciséis; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; dieciséis; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; dieciséis; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; dieciséis; dieciséis; dieciséis; dieciséis; 15; dieciséis; dieciséis; dieciséis; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;]

Me gustaría detectar, por ejemplo

Onda P en [19 - 37]

Complejo QRS en [51 - 64]

etc ...


Lo primero que haría es simplificar los datos.

En lugar de analizar datos absolutos, analice la cantidad de cambio de un punto de datos al siguiente.

Aquí hay un trazador de líneas rápido que tomará ; datos separados como entrada, y salida el delta de esos datos.

perl -0x3b -ple''( $last, $_ ) = ( $_, $_-$last )'' < test.in > test.out

Al ejecutarlo en los datos que proporcionó, este es el resultado:

0; 0; 20; 0; 0; -1; -1; -1; 0; 0; 0; -1; 0; 0; 0; 0; 0; 0; 1; 0; 1; 1; 1; 1; 1; 1; 0; 0; 2; 0; -2; -1; -2; -1; -2; -1; 0; -2; -1; 1; -1; 0; - 1; 0; 0; 0; 0; -1; 0; -1; 2; 4; 6; 9; 7; 6; -4; -6; -8; -7; -5; -4; 0; -1; 0; - 1; 1; 1; 0; 1; 0; -1; 1; 0; 0; 0; 0; 0; 0; -1; 0; 1; 1; -1; 0; 1; 0; 0; 0 ; 1; 0; -1; 1; 2; 2; 0; 1; 1; 1; 1; 1; 1; 1; 0; 0; 1; 0; 0; -1; -2; -1; -2; -2; -2; -2 ; 0; -1; -1; 0; -1; 0; -1; 0; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 1; 1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 1; -1; 0; 0; 1; 0; 0; 0; 0; 0; 0; -1; 1; 0; 0; 0; 0; ; -1; 0; 0; 0; 0; 1; 0; 1; 1; 0; 1; 0; 0; 1; 1; 1; 0; 0; 0; -1; -1; -2; - 1; 0; -2; 0; -1; 0; -1; 0; 1; -1; 0; 0; -1; 0; 0; 0; 1; 5; 5; 7; 8; 4; -7; -5; -8 ; -7; -6; -2; -1; 0; 0; 0; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; -1; 1; 0; 0; 0; ; 1; 0; 0; 0; 1; 0; 1; 0; 0; 0; 1; 1; 0; 2; 1; 1; 1; 1; 1; 1; 1; 1; 1; -1; 1; 0; 0; -1; -2; -2; -2; -2; -1; 0; -1; -2; -1; 0; -1; -1; 0; 1; -1; 1; 0; -1; 1; -1; 1; 0; -1; 0; 0; 0; -1; 1; 0; 0; 1; 0; -1; 0; 1; 0; 0; 1; -1; 0; -1; 1; 0; -1; 0; 0 ; 0; 0; 1; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 1; -1; 0; 1; 0; 0; 2; 0; 1; 0; 1; 1; 1; -1; 0; -2; 0; -1; -2; 0; -1; -1; -2; -1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 0; 0; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4; -2; -2; 0; 0; -1; 1; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; 0; 0; 1; -1; 0; 1; 1; 0; 0; 0; 0; 1; 0; 1; 0; 1; 2; 1; 1; 2; 0; 1; ; 1; 1; 1; 0; 0; 1; 1; 0; 0; -35; 0; 0; 0;

Hay nuevas líneas insertadas en el texto anterior que originalmente no estaban presentes en la salida.

Después de haber hecho eso, es trivial encontrar el complejo qrs.

perl -F'';'' -ane''@F = map { abs($_) > 2 and $_ } @F; print join ";", @F''< test.out

;; 20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 4; 6; 9; 7; 7; 6; -4; -6; -8; -7; -5; -4;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;; 5; 5; 7; 8; 9; 4; -7; -5; -8; -7; -6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 35 ;;;

Los 20 y -35 puntos de datos resultan de los datos originales que comienzan y terminan con 0 .

Para encontrar los otros puntos de datos, deberá confiar en la coincidencia de patrones.

Si miras la primera onda p, puedes ver claramente un patrón.

0;0;0;0;0;0;1;0;1;1;1;1;1;1;0;0;2;0;-2;-1;-2;-1;-2;-1;0;-2;-1;1;-1;0;-1;0;0;0;0; # /________ up _______/ /________ down _________/

Sin embargo, no es tan fácil ver el patrón en la segunda onda p. Esto se debe a que el segundo se extiende aún más

0;0;0;1;0;1;1;0;1;0;0;1;1;1;0;0;0;-1;-1;-2;-1;0;-2;0;-1;0;-1;0;1;-1;0;0;-1;0;0;0; # /________ up _______/ /________________ down ________________/

La tercera onda p es un poco más errática que las otras dos.

0;0;0;0;0;1;-1;0;1;0;0;2;0;1;0;1;1;1;-1;0;-2;0;-1;-2;0;-1;-1;-2;-1;0;0;0;0;0; # /_______ up ______/ /__________ down __________/

Encontrarías las ondas t de manera similar a las ondas p. La principal diferencia es cuando ocurren.

Esto debería ser suficiente información para comenzar.

Los dos envases de una sola línea son, por ejemplo, únicos, no recomendados para uso diario.


" Wavelet transform " puede ser una palabra clave relevante. Una vez asistí a una presentación de alguien que utilizó esta técnica para detectar diferentes fases de latido cardíaco en un ecg ruidoso.

En lo que respecta a mi comprensión limitada, es algo así como una transformada de Fourier, pero utilizando copias (a escala) de un pulso, en su caso con forma de latido del corazón.


¡Esta es una pregunta maravillosa! Tengo algunas ideas:

Dynamic Time Warping podría ser una herramienta interesante aquí. Usted establecería "plantillas" para sus tres clases, y luego usando DTW podría ver la correlación entre su plantilla y "fragmentos" de la señal (divida la señal en, por ejemplo, bits de .5 segundos, es decir, 0-.5. 1-.6 .2-.7 ...). He trabajado con algo similar para el análisis de la marcha con datos de acelerómetro, funcionó razonablemente bien.

Otra opción es un algoritmo combinado de procesamiento de señal / aprendizaje automático. Divide tu señal en "trozos" de nuevo. Haga "plantillas" nuevamente (querrá una docena más o menos para cada clase) tome la FFT de cada fragmento / plantilla y luego use un clasificador Naïve Bayes (u otro clasificador ML, pero NB debe cortarlo) para clasificar para cada uno de tus tres clases. También probé esto con los datos de la marcha, y pude obtener una precisión superior al 98% y recuperarla con señales relativamente complicadas. Déjame saber cómo funciona esto, es un problema muy emocionante.


¿Has probado biosppy ? si está usando Python, puede usarlo directamente. Si no, puede leer su código fuente y modificarlo a su idioma.


¿Son esos otros dos picos y valles agudos también complejos qrs?

Por la parte superior de mi cabeza, creo que lo que debes hacer es calcular la pendiente de este gráfico en cada punto. Entonces también necesita ver qué tan rápido cambia la pendiente (2da derivada ???). Si tienes un cambio abrupto, entonces sabes que has alcanzado un pico agudo. Por supuesto, desea limitar la detección del cambio, por lo que es posible que desee hacer algo como "si la pendiente cambia por X en el intervalo de tiempo T", para que no capte los pequeños baches en el gráfico.

Ha pasado un tiempo desde que hice algunas matemáticas ... y esto parece una pregunta matemática;) Ah, y tampoco he hecho ningún tipo de análisis de señales :).

Solo agregando otro punto. También puedes probar la promediación de la señal, creo. Por ejemplo, promediando los últimos 3 o 4 puntos de datos. Creo que también puedes detectar cambios abruptos.


Alaor, esta es una muy buena pregunta. ¿Pensaste ya en Redes Neuronales? Aquí tienes mucha información, puedes enseñarles a reconocer las olas (entrenarlas) o usar Fuzzy Logic ... Yo elegiría un enfoque de redes neuronales.

¡Espero que esto ayude!


Conozco a un chico que trabajó en este campo. Aquí puede encontrar una lista de sus publicaciones . Si mal no recuerdo, utiliza Hidden Markov Models para detectar ondas de manera confiable contra un conjunto de formas conocidas, pero encontrarás más detalles en los documentos.


En primer lugar, los diversos componentes de la onda estándar del electrocardiograma pueden faltar en cualquier trazado dado. Tal trama es generalmente anormal y generalmente indica algún tipo de problema, pero no se le puede prometer que están allí.

En segundo lugar, reconocerlos es tanto arte como ciencia, especialmente en los casos en que algo va mal.

Mi enfoque podría ser intentar entrenar una red neuronal para identificar los componentes. Le daría los datos de los 30 segundos previos, normalizados, por lo que el punto más bajo estaba en 0 y el punto más alto en 1.0 y tendría 11 salidas. Las salidas que no eran clasificaciones de anormalidad serían una ponderación de los últimos 10 segundos. Un 0.0 sería -10 segundos desde el presente, y un 1.0 significaría ahora. Los resultados serían:

  1. Donde comenzó la onda P más reciente
  2. Donde terminó la onda P más reciente
  3. Clasificación de anormalidad de la onda P más reciente con un extremo ausente.
  4. Dónde comenzó el complejo QRS más reciente
  5. Donde la porción Q del complejo QRS más reciente se convirtió en la porción R.
  6. Donde la porción R del complejo QRS más reciente se convirtió en la porción S.
  7. Dónde terminó el complejo QRS más reciente.
  8. Clasificación de anormalidad del complejo QRS más reciente con un extremo ausente.
  9. Donde comenzó la onda T más reciente.
  10. Donde terminó la onda T más reciente.
  11. Calificación de anormalidad de la onda T más reciente con un extremo ausente.

Podría verificar esto con algunos de los otros tipos de análisis sugeridos por las personas, o usar esos otros tipos de análisis junto con el resultado de la red neuronal para darle su respuesta.

Por supuesto, esta descripción detallada de la red neuronal no debe tomarse como prescriptiva. Estoy seguro de que no seleccioné necesariamente los resultados más óptimos, por ejemplo, simplemente arrojé algunas ideas sobre lo que podrían ser.


Lo primero que haría es ver lo que ya existe . De hecho, este problema específico ya ha sido muy investigado. Aquí hay una breve descripción de algunos métodos realmente simples: link .

Debo responder a otra respuesta, también. Investigo en procesamiento de señales y recuperación de información musical. En la superficie, este problema parece similar a la detección de inicio, pero el contexto del problema no es el mismo. Este tipo de procesamiento de señales biológicas, es decir, la detección de las fases P, QRS y T, puede explotar el conocimiento de las características específicas del dominio del tiempo de cada una de estas formas de onda. La detección de inicio en MIR no lo hace, realmente. (No de manera confiable, al menos)

Un enfoque que funcionaría bien para la detección de QRS (pero no necesariamente para la detección de inicio de nota) es el cambio de tiempo dinámico. Cuando las características del dominio del tiempo permanecen invariables, DTW puede funcionar notablemente bien. Aquí hay un breve documento de IEEE que usa DTW para este problema: link .

Este es un buen artículo de la revista IEEE que compara muchos métodos: link . Verá que se han probado muchos modelos comunes de procesamiento de señal. Eche un vistazo al papel y pruebe uno que comprenda en un nivel básico.

EDITAR: Después de navegar por estos artículos, un enfoque basado en wavelet me parece más intuitivo. DTW también funcionará bien, y existen módulos de DTW, pero el enfoque wavelet me parece mejor. Alguien más respondió explotando derivados de la señal. Mi primer enlace examina métodos anteriores a 1990 que hacen eso, pero sospecho que no son tan sólidos como los métodos más modernos.

EDITAR: Trataré de dar una solución simple cuando tenga la oportunidad, pero la razón por la que creo que las wavelets son adecuadas aquí es porque son útiles para parametrizar una amplia variedad de formas independientemente de la escala de amplitud o de tiempo . En otras palabras, si tiene una señal con la misma forma temporal repetida pero a diferentes escalas de tiempo y amplitudes, el análisis de ondículas aún puede reconocer que estas formas son similares (aproximadamente hablando). También tenga en cuenta que estoy tipo de agrupamiento de bancos de filtros en esta categoría. Cosas similares.


Mi respuesta a una pregunta similar sobre la detección de patrones en datos de series de tiempo está aquí - https://.com/a/11903770/1149913 - e incluye código python.

Mi enfoque era un "modelo de markov oculto autorregresivo" (google la frase para algunas publicaciones relevantes).


No me he leído bien la respuesta, pero los he escaneado y noté que nadie recomendaba mirar la Transformada de Fourier para segmentar estas ondas.

Para mí, parece una aplicación clara del análisis armónico en matemáticas. Puede haber varios puntos sutiles que me pueden estar perdiendo.

Los coeficientes de Transformada de Fourier Discreta le dan la amplitud y la fase de los diferentes componentes sinusoidales que conforman su señal de tiempo discreta, que es esencialmente lo que su problema declara que desea encontrar.

Aunque me puede estar perdiendo algo aquí ...


No soy un experto en este problema específico, pero tengo un conocimiento más general: supongamos que conoce el complejo QRS (o alguna de las otras características, pero usaré el complejo QRS para este ejemplo) se lleva a cabo en aproximadamente un período de tiempo fijo de longitud L. Me pregunto si podría tratar esto como un problema de clasificación de la siguiente manera:

  1. Divida su señal en ventanas superpuestas de longitud L. Cada ventana tiene o no el complejo completo de QRS.
  2. Fourier transforma cada ventana. Tus características son la potencia de la señal en cada frecuencia.
  3. Entrene un árbol de decisión, una máquina de vectores de soporte, etc. en algunos datos anotados a mano.

Puedes usar cross-correlation . Tome una muestra modelo de cada patrón y correlacione con la señal. Obtendrá picos donde la correlación es alta. Esperaría buenos resultados con esta técnica extrayendo ondas qrs y t. Después de eso, puedes extraer ondas p buscando picos en la señal de correlación que están antes qrs.

La correlación cruzada es un algoritmo bastante fácil de implementar. Básicamente:

x is array with your signal of length Lx y is an array containing a sample of the signal you want to recognize of length Ly r is the resulting correlation for (i=0; i<Lx - Ly; i++){ r[i] = 0; for (j=0; j<Ly ; j++){ r[i] += x[i+j]*y[j]; } }

Y busque picos en r (valores por encima de un umbral, por ejemplo)


Se ha demostrado que las ondículas son la mejor herramienta para localizar picos en este tipo de datos donde los picos tienen "diferentes tamaños": las propiedades de escalado de las ondículas lo convierten en una herramienta ideal para este tipo de detección de picos a múltiples escalas. Esto parece una señal no estacionaria, por lo que usar una DFT no sería la herramienta correcta, como algunos han sugerido, pero si se trata de un proyecto exploratorio, se podría usar el espectro de la señal (estimado utilizando esencialmente la FFT de la autocorrelación de la señal.)

Here hay un excelente artículo que revisa varios métodos de detección de picos; este sería un buen lugar para comenzar.

-Pablo


Un enfoque que muy probablemente rinda buenos resultados es el ajuste de curva:

  • Divida la ola continua en intervalos (probablemente sea mejor tener los límites del intervalo a mitad de camino entre los picos agudos de los complejos qrs). Solo considere un intervalo individual a la vez.
  • Defina una función modelo que se puede usar para aproximar todas las variaciones posibles de las curvas electrocardiográficas. Esto no es tan difícil como parece primero. La función del modelo se puede construir como una suma de tres funciones con parámetros para el origen (t_), la amplitud (a_) y el ancho (w_) de cada onda.

    f_model(t) = a_p * f_p ((t-t_p )/w_p) + a_qrs * f_qrs((t-t_qrs)/w_qrs) + a_t * f_t ((t-t_t )/w_t)

    Las funciones f_p(t) , f_qrs(t) , f_t(t) son algunas funciones simples que se pueden usar para modelar cada una de las tres ondas.

  • Utilice un algoritmo de ajuste (por ejemplo, el algoritmo Levenberg-Marquardt- http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm //en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm) para determinar los parámetros de ajuste a_p, t_p, w_p, a_qrs, t_qrs, w_qrs, a_t , t_t, w_t para el conjunto de datos de cada intervalo.

    Los parámetros t_p, t_qrs y t_p son los que le interesan.


Una pieza de este rompecabezas es la " detección de inicio " y se han escrito varios algoritmos complejos para resolver este problema. Aquí hay más información sobre los onsets .

La siguiente pieza es una Distancia de Hamming . Estos algoritmos le permiten hacer comparaciones difusas, la entrada es de 2 matrices y la salida es una "distancia" o diferencia entera entre los 2 conjuntos de datos. Cuanto menor es el número, más parecidos son los 2. Esto es muy parecido a lo que necesita, pero no es exacto. Seguí adelante e hice algunas modificaciones al algoritmo Hamming Distance para calcular una nueva distancia, probablemente tiene un nombre, pero no sé qué es. Básicamente, suma la distancia absoluta entre cada elemento de la matriz y devuelve el total. Aquí está el código para ello en python.

import math def absolute_distance(a1, a2, length): total_distance=0 for x in range(0,length): total_distance+=math.fabs(a1[x]-a2[x]) return total_distance print(absolute_distance([1,3,9,10],[1,3,8,11],4))

Este script genera 2, que es la distancia entre estos 2 arrays.

Ahora para armar estas piezas. Puede usar la detección de inicio para encontrar el comienzo de todas las ondas en el conjunto de datos. A continuación, puede recorrer estas ubicaciones comparando cada onda con una muestra P-Wave. Si alcanzas un Complejo QRS, la distancia será la más grande. Si golpeas otra P-Wave, el número no será cero, pero será mucho más pequeño. La distancia entre cualquier P-Wave y cualquier T-Wave va a ser bastante pequeña, SIN EMBARGO esto no es un problema si se hace la siguiente suposición:

The distance between any p-wave and any other p-wave will be smaller than the distance between any p-wave and any t-wave.

La serie se ve así: pQtpQtpQt ... La onda p y la onda t están una junto a la otra, pero como esta secuencia es predecible, será más fácil de leer.

Por un lado no, probablemente haya una solución basada en cálculo para este problema. Sin embargo, en mi opinión, el ajuste de curvas y las integrales hacen que este problema sea más complicado. La función de distancia que escribí encontrará la diferencia de área que es muy similar al restar la integral de ambas curvas.

Tal vez sea posible sacrificar los cálculos iniciales a favor de iterar en 1 punto a la vez y así realizar cálculos de distancia O (n), donde n es el número de puntos en el gráfico. Si tuviera una lista de todos estos cálculos de distancia y supiera que hay 50 secuencias de pQt, entonces sabría las 50 distancias más cortas que no se superponen en todas las ubicaciones de las ondas p. ¡Bingo! ¿Cómo es eso por simplicidad? Sin embargo, la compensación es la pérdida de eficiencia debido a un mayor número de cálculos de distancia.


Ya tienes una cantidad de buenas respuestas. Me sorprende que nadie sugiriera '' Paquete de software WFDB '' de PhysioToolkit , específicamente la ecgpuwave


usando BioSPPY

actualmente no es posible implementar el análisis de la onda T, ya que actualmente solo contiene el análisis de la onda R. por ejemplo, Tstart Tpeak Tend

no están implimented automáticamente

uno debería usar su propio análisis.

mi sugerencia sería intentar implementar el siguiente método

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3201026/

que es uno que recientemente descubrí y encontré que es muy interesante

El otro método de análisis de la onda t que vale la pena mirar es el del equipo de ECGlib

http://ieeexplore.ieee.org/document/6713536/

espero que esto ayude