UNIVER5IDAD AUTbNOMA METROPOLITANA ... . .. IZTAPALAPA DIVI516N DE CIENCIA5 6Á5lCA5 E INGENIERíA Departamento de Ingenieria Eléctrica Optimización del proceso de obtención un deCTG fetal a partir de una se’3ial de ECG abdominal Tesis que presenta el alumno: RodrigolRivera Hernández Matricula 95320931 Para la obtención del grado de: Licenciatura en Ingeniería Biomédica Con área de concentraciónen: Instrumentación Médica Electrónica Asesor: M. en 1.6. Rocio Ortiz Abril del 2001 ?“““di CONTENIDO CONTENIDO I.- INTRODUCCI~N 1.I.- Calrdiotacografía 1.2.- Parámetros de la frecuencia cardiaca fetal. '1.2.1.- Línea de base '1.2.2.- Variabilidad 1.3.- Alteraciones de la frecuencia cardiaca fetal basal '1.3.1.- Taquicardia '1.3.2.- Bradicardia 1.4.- Alteraciones de la variabilidad 'I .4.1_-Aumentos de la variabilidad 'I .4.2.- Disminución de la variabilidad 1.5.- Alteraciones periódicas dela frecuencia cardiaca fetal 'I S.1.- Aceleraciones 1.5.2.- Desaceleraciones 1 S.2.1.-Desaceleración precoz 1.5.2.2.-Desaceleración tardía 1.5.2.3.- Desaceleraciones variables 1.6.- La 'JFC como un indicador de bienestar I' .4.1.- Consideraciones fisiológicas 1.7.- Justificación del proyecto 1.8.- Antecedentes 1.9.-Hipótesis 1. I 0.- Objetivos 11.- METODOLOGíA 2.1 .- Descripcibn del procedimiento 2.2.- Méiodo de evaluación 111.- RESULTADOS IV.- DISCUSI~N V.- CONCLUSIONES VI.- BIBLIOGRAFíA APÉNDICE. Rutinas y procedimientos de computo en lenguaje MatlabB ii INTRODUCCION INTRODUCCI~N 1 .I.-CARDlOTACOGRAFíA Un cardiotacograma (CTG) es un registro de la frecuencia cardiaca fetal (FCF) ya sea medido con un transductor en el abdomen o con un censor que debe estar en contacto con el feto. A parte de la FCF, unsegundo transductor, midelas contracciones uterinas sobre el fondo del saco gestacional. Diagrama 1.1.Obtención del CTG El trazo del CTG generalmente presenta dos líneas. La línea superior es un registro de la frecuencia cardiaca fetal en latidos por minuto. La línea inferiores un registro de las contracciones uterinas. La escala vertical de este trazo depende de la forma en la que el transductor registra las contracciones, por lo tanto, la interpretación se debe realizar en relación con el resto del trazo. El trazo también puede presentar marcas (registradas mediante un interruptor que controla la madre), que son indicaciones de que la madre sintió un movimiento fetal. La siguiente sección describe los diferentes parámetros y alteraciones de la frecuencia cardiaca fetal así como los patrones que se observan en el trazo de un CTG. 1.2.- PARÁMETROS DE LA FRECUENCIACARDIACAFETAL. En la frecuencia cardiaca fetal normal distinguimos dos características importantes: su línea de base (frecuencia cardiaca fetal basal) y su variabilidad. 1.2.1.-Línea de base Representa la FCF media y se mide en los intervalos entre contracciones. Su frecuencia normal oscila entre 110 y 150 latidos por minuto. Esta frecuencia se debe al gobierno de los sistemas parasimpático y simpático sobre el corazón fetal. La línea de base en fetos prematuros (menos de 30 semanas) se acerca a 160 latidos por minuto. Después a medida que avanza la edad gestacional, esta frecuencia basal disminuye progresivamente hasta unos 140 latidos por minuto. La administración de atropina, paralizando el parasimpático fetal, restaura la frecuencia cardiaca fetal a 160 latidos por minuto, cualquiera que sea la edad gestacional. Ello indica el progresivo control del parasimpático sobre la FCF a medida que aumenta la edad gestacional. Por el contrario, la administración del propranolol (un bloqueador del sistema adrenergic0 p) disminuye la frecuencia cardiaca fetal, señalando el control del sistema simpático. La línea base puede cambiar espontáneamente, o por diversos factores etiológicos (bradicardia y taquicardia fetales). También existen cambios en la FCF que son sólo modificaciones periódicas, para distinguir unos de otro debe considerarse que los cambios de la línea de base son aquellas variaciones de la FCF que duran más de 15 minutos. A continuación se presenta una sección de un CTG quemuestra una línea de base normal típica. Figura 1.1: CTG que muestra una Línea de Base normal INTRODUCCION 1.2.2.- Variabilidad La variabilidad de la frecuencia cardiaca fetal (VCF) latido a latido (oscilaciones de la FCF que ocurren al integrar como frecuencia los intervalosentre latido y latido) refleja unamodulación neurológica normal y una capacidad normalde respuesta del corazónfetal. Se considera que existen dos tipos de variabilidad: variabilidad a corto plazo (variabilidad latido a latido producidapor la variabilidadnormal de los intervalosen el ciclo eléctricocardiaco)y la variabilidad a largo plazo (representada por una ondulación enel trazado de la frecuencia cardiaca feta, con una frecuencia de 3 a 5 ciclos por minuto). La variabilidad a corto plazo muestra, normalmente, unas diferencias medias de 1-2 latidos por minuto, al integrar a frecuencias los intervalos entre señal básica y señal básica. La variabilidad a largo plazo normal presenta amplitudes que oscilan entre5 y 20 latidos por minuto. Lasinfluenciasparasimpáticasactúanatravés de impulsosrápidosycortos,mientrasque las simpáticas lo hacen a través de impulsos más lentos y sostenidos. Druzen (1979) demostró que la variabilidad a corto plazosedebeavariacionesen el tonoparasimpático,mientrasque la variabilidad a largo plazo se debe a variaciones en el tono simpático sobreel corazón fetal. Existe una causafisiológica de disminución de la variabilidad. Se trata de laalteración en elfeto de periodos de “sueño” (con variabilidad disminuida) y “vigilia” (con variabilidad normal). Estos ciclos pueden durar 20 o 30 minutos; no es de preocupar el encontrar una variabilidad disminuida que, espontáneamente, a los poco minutos vuelve a la normalidad. La estimulación del feto durante la manipulación del útero o el aplicar sonidos relativamente intensosjunto al abdomen de la gestante contribuyen a <despertar> al feto y al retorno de la variabilidad normal. Lasmodificacionesde la FCFse clasifican enalteraciones dela FCFbasal(taquicardiay bradicardia); alteraciones de la variabilidad (por aumento o disminución) y alteraciones periódicas de la FCF (aceleraciones y desaceleraciones precoces, tardías y variables). 1.3- ALTERACIONES DE LA FRECUENCIA CARDIACAFETAL BASAL. 1.3.1.- Taquicardia: La taquicardia fetal se define como la FCF basal por encima de los 150 latidos por minuto. Puesto que las taquicardias traducen aumento del tono simpático y disminución de tono parasimpático, generalmente van acompañadas de disminución de la variabilidad a largo plazo. La taquicardia fetal puede ser producida por uno o más de los siguientes factores: 1. Hipoxia fetalleve. 2. Fiebre materna. 3. Amnionitis. 4. Administración de parasimpaticolíticos: atropina, atarax y fenotiacinas. 5. Administración de p-adrenérgicos; hipertiroidismo materno, anemia fetal, fallo cardiac0 y taquiarritmia cardiaca fetal. A continuación se presenta una sección deun CTG que muestra taquicardia b 33 6 Figura 1.2. Taquicardia 1.3.2.- Bradicardia. Se define como laFCF basal inferior a 110 latidos por minuto. Si la bradicardia no desciende a 8090 latidos por minuto y la frecuencia cardiaca mantiene su variabilidad, la oxigenación fetal no suele estar afectada. En ocasiones, en un registro, puede confundirse una bradicardia basal con desaceleraciones prolongadas, en las que una desaceleración sucede a otra sin que la FCF tenga tiempo de volver a su línea de base. En estos casos, la variabilidadestá disminuida, y el pronóstico fetal es grave. La administración de propranolol a la madre puede ser causa debradicardia fetal. A continuacibn se presenta una sección de unCTG que muestra bradicardia. w t INTRODUCCION 1.4.- ALTERACIONES DE LA VARIABILIDAD La variabilidad puede estar aumentadao disminuida. Las variaciones a corto plazo en la línea de base deben estar entre los 10 y 151pm (excepto durantelos intervalos de suelo fetal que no deben 60 minutos). Una variabilidadreducidadeformaprolongadajuntoconotras sermayoresa anormalidades, pueden ser indicativo de sufrimiento fetal. 1.4.1.- Aumentos de la variabilidad. Constituyen el signo más precoz de hipoxia fetal leve. Por ello se observa con frecuenciaal inicio de la aparición de desaceleraciones tardías.Dos todos modos, cuando la variabilidad es normal o está aumentada el pH fetal se mantiene aún en los límites de la normalidad. El aumento de la variabilidad (tanto en la variabilidad de corto como largo plazo) que acompaña a al hipoxemia leve y perece deberse, según Druzen, a un aumento del tono simpático que produciría hipertensión aumento de la variabilidad a largo plazo. A su vez, la hipertensión produciría estimulación de los bar0 receptoresy reflejo vagal vasodilatador.El aumento del tonovagal aumentaríala variabilidad a corto plazo. 1.4.2.- Disminución de la variabilidad. S e debe a cualquier podemos citar: 1. 2. 3. 4. 5. 6. 7. 8. 9. causa capaz de producir depresión del sistema nervioso fetal. Entre ella Analgésicos Narcóticos. Barbitúricos. Tranquilizantes. Fenotiacinas. Parasimpaticolíticos. Bloqueadores p-adrenérgicos. Anestésicos generales. Hipoxia (moderadao grave)-acidosis. Evidentemente; la hipoxiamoderada o grave y la acidosis es la causa más preocupante. Generalmente en la hipoxia moderada o grave, la disminución de la variabilidad va acompañada Apgar al nacer. La causa dela de desaceleracionestardías,acidosis fetal y bajoíndicede disminucióndelavariabilidadenlahipoxiamoderada o grave es una depresión del sistema nervioso central fetal producida por la misma hipoxia, tanto en el sistema simpático como en el parasimpático. AI parecer, los efectos de la hipoxia moderada o grave en la disminuci6n de la variabilidad no los dos tipos (a corto y largo plazo) de la variabilidad. Según afectan de modo simultáneo a estudios de Madanlou y Cols. (1977), la variabilidad a corto plazo será la primera en disminuir, seguida de lavariabilidad a largo plazo. Por elcontrarioal recuperarse elfetodelahipoxia reaparecería primero la variabilidad a largo plazo, seguida de la reaparición de la variabilidad a corto plazo. Puesto que la variabilidad a corto plazo está dominada porel parasimpático, esto indica que el sistemavagal es mássensible a la hipoxia que el sistema simpático. Cuando laperdidadelavariabilidad no va acompañadadedesaceleracionestardías (y se excluyen las demás causas antes citadas) y el ritmo basal es normal, probablementese trata de una lesión del cerebro fetal producida anteriormente, cuya causa (hipóxica, infecciosa, etc.) ha cedido, pero permanece la secuela cerebral. Este patrón es frecuente en fetos con lesiones del sistema nerviosocentral y también encasos prematuros. Ocasionalmentees idiopática,y el recién nacido será normal. INTRODUCCION Un patrón de la disminución de la variabilidad que se observa muy rara vez es llamado patrdn sinusoidal. Secaracterizaporausencia dela variabilidadacortoplazoenpresenciadeuna variabilidad a largo plazo normal y muy uniforme. Este patrón se ha observado en la anemia fetal grave debida a eritroblastosis o hemorragia feto-materna, así como en casos graves de asfixia durante el parto. Lascausasdeéstepatrónsinusoidalnoestán claras. No obstante,seha observado el mismo patrón en recién nacidoseritroblastóticos. A continuaciónsepresentaunasección de un CTG quemuestraunadisminuciónen la variabilidad. Figura 1.4. Disminución de la variabilidad. 7 1.6.- ALTERACIONES PERIóDICAS DE LA FRECUENCIA CARDIACA FETAL. Lasalteracionesperiódicassedefinen como alteraciones transitorias (y periódicas) de la FCF pueden aparecer por causasfisiológicas en respuesta a movimientos fetales o en respuesta a cada contracción uterina. En estos casos su significado es el mismo que una variabilidad normal. En otros casos las aceleraciones traducen una compresión parcial del cordón umbilical en la que la vena se ocluye, mientras lasarterias seguirían permeables. Ello produciría disminución del retorno sanguíneo al feto con hipotensión y estimulaciónde los baro receptores. La respuesta de éstos a la hipotensión y a la disminución del retorno es un incremento en la frecuencia cardiaca, o sea, una aceleración. Las aceleraciones periódicas no suelen ir acompañadas de hipoxia fetal. Se trataría, simplemente, de un ajuste circulatorio. 1.6.1.-Aceleraciones Estas se definen como incrementos transitorios de la FCF mayores a los 151pm por al menos 15 segundos.Cuandosepresentandosaceleraciones en unperiodo de 20 minutosseconsidera como un trazo reactivo. Lasaceleracionessonunabuenaseñaldebidoaquemuestran la capacidad de respuesta fetal y la integridad de los mecanismos que controlanel corazón. A continuaciónsepresentaunasección respuesta a estímulos. de unCTGquemuestraunaaceleración típica como 8 INTRODUCCION 1.6.2.- Desaceleraciones Las desaceleraciones o retardos de la FCF que aparecen en relación con la contracción uterina son las alteraciones del registro de la FCF que merece un estudio más detallado. Para que una desaceleración pueda ser considerada como tal la diferencia entre la línea de base de la FCF y el momento en que la desaceleración es máxima, o sea, el momento de frecuencia cardiaca mínima correspondiente a ésta desaceleración (amplitud de la desaceleración), debe ser por lo menos de 20 latidos por minuto. Además, para ser considerados como tales deben presentarse durante varias contracciones (alteración periódica). Existen 3 tipos fundamentales de desaceleración: La desaceleración precoz, la tardía y la variable. 1.6.2.1.-Des.c. -ración precoz El patrón de F i refleja casi como en un espejo la forma de la contracción uterina. El inicio de la desaceleracibn p )z coincide con el inicio de la contracción uterina y el final de la primera con el de la segunda. L desaceleraciones precoces tempranas, como alteraciones periódicas de la frecuencia cardiaca, se repiten con cada contracción, o por lo menos con cada contracción que ocurre durante un determinado periodo de parto y son uniformes unascon otras variando ligeramente la amplitud si las contracciones son más intensas. No se ha demostrado que éstas desaceleraciones precoces tengan significado patológico, nivan acompañadasde fetos con depresión hipoxica. Lacausade éstas desaceleraciones precoces o tempranas parece ser el aumento de la tensión intracraneal que se produce durante la contracción uterina por compresión de la cabeza fetal. El aumento de la tensión intracraneal pone en marcha la estimulación del vago o parasimpático, por lo que se retarda la frecuencia cardiaca fetal. Como prueba de ello tenemos que la compresión exógena (provocada por una mano comprimiendo la cabeza fetal por encima de pubis)de la cabeza fetal escapazde producir un retardo de la FCF. Estas desaceleraciones precoces son mucho más frecuentes en los partos en presentación cefálica que en podálica, en las últimas fases del parto que en las primeras, y después de romperse la bolsa de líquido amniótico. Todo ello señala la compresión de la cabeza fetal comocausa principal. ' Las desaceleraciones precoces no van asociadas con taquicardia, disminución de la variabilidadni otros cambios de la FCF, si se asocian estos cambios, es posible que el diagnóstico sea erróneo y se trate de otro tipo de deceleraciones. Las afirmaciones o suposiciones de que las desaceleraciones precoces pueden tener unsignificado patológico, o que significan un peligro para el feto por el aumento de la tensión intra craneal, que dificultaría la circulación cerebral, se basan más en presunciones que en hechos científicamente demostrados. 9 INTRODUCCION A continuación se presenta una sección de unCTG que muestra una desaceleración precoz. , Figura 1.6. Desaceleración Precoz -0 . I . . INTRODUCCION 1.6.2.2.-Desaceleración tardía Es también una alteración periódica que se repite a cada contracción, por lo menos durante cierto periodo del parto. Una sola desaceleración, no por ser alteración periódica, tampoco es desaceleración tardía, ni precoz, ni variable.Laforma dela desaceleracióntardíaesmuy semejante a la desaceleración precoz: es decir, es como una imagen especular de la contracción uterina. Sin embargo, permite ladiferenciación entre la desaceleración precoz y la tardía: así como en la precoz el inicio de la desaceleración, y su final, coinciden con el inicio y con el final de la contracción uterina, en la tardía la desaceleración se inicia uno 15 segundos más tarde que el inicio de lacontracción uterina, y se prolonga más allá del final de dicha contracción. Es decir, aquí la desaceleración se produce con cierto retraso en relación con la contracción y no simultáneamente, como ocurre en la desaceleración precoz. La forma, duración y amplitud de las desaceleraciones tardías que aparecen a cada contracción son también similares de unas a otras. Las desaceleraciones tardías no suelen ir precedidas ni seguidas de aceleraciones (al contrario de lo que sucede en las desaceleraciones variables). Si las contracciones son muy frecuentes por superposición de sucesivas desaceleracionestardías, puede aparecer luna bradicardia persistente. La desaceleración tardía traduce una disminución del aporte de oxigeno al feto, provocado por la contracción uterina. Su causa puede ser una contractilidad uterina excesivao una insuficiencia por parte de la placenta en efectuar los intercambios gaseosos, o ambos factores a la vez. Por ello se dice que la desaceleración tardía se debe a una insuficiencia útero-placentaria.El retraso existente entre la contracción uterina y la aparición de la desaceleración tardía, se atribuye al tiempo que tarda la contracción en producir la hipoxemia en la circulación capilar fetal, más eltiempo que ésta sangre hipoxémica tarda en alcanzar el miocardio y el sistema nervioso central delfeto. Aparte del númeroy la amplitud de las desaceleraciones tardías, las doscaracterísticasque señalan un empeoramiento de la hipoxia fetal son la aparición de taquicardia fetal basal progresiva (persistiendo las desaceleraciones tardías) y la perdida de variabilidad latido a latido. Las desaceleraciones tardías tienen, por tanto, un significado patológico, como lo demuestra el hecho de que en aquellos fetos que han sufrido más de 20 desaceleraciones tardías en el curso del parto, el promedio del pH de la arteria y vena umbilicales es significativamente menor que en aquellos que han tenido menos de 20 desaceleraciones tardías. También la incidencia de indices de Apgar inferiores a 7 es mayor en el grupo de casos con más de 20 desaceleraciones tardías en el curso del parto. A continuación se presenta una sección de un CTG que muestra una desaceleración tardía. Figura 1.7. Desaceleración Tardía 1A.2.3.- Desaceleraciones variables. Difiere de la precoz y de la tardía en que, tanto en el momento de su inicio en relación con la contracción uterina, como su forma y amplitud y su duración son variables deuna a otra desaceleración. Tampoco reflejan de modo especular la forma de la contracción uterina. Unas veces su duración es menor que la de la contracción; otras mucho mayor. Mientras que las desaceleraciones precoces o tardías, en general la caída de la FCF no suele sobrepasar el límite de los 120 latidos por minuto (y por tanto suele ocurrir dentro de los límites de la normalidad de la FCF basal), en las desaceleraciones variables el límite inferior puede ser ampliamente sobrepasado, llegando a casos extremos incluso a 60 latidos por minuto. A continuación se presenta una sección de unCTG que muestra una desaceleración variable. Figura 1.8. Desaceleracion variable INTRODUCCION 1.6.- LA VFC COMOUN INDICADOR DE BIENESTAR. El monitoreo fetal permiteobtenerun registro de las funciones fisiológicas vitales durante el embarazo y el nacimiento. Este monitoreo puede ser de utilidad en la evaluación del proceso del embarazo y el parto, y con el se pueden identificar condiciones que comprometan la salud del feto y/o la madre ya que bajoestascondicionesambos se enfrentanaunestrés fisiológico considerable. A menos que los problemas durante el embarazo sean detectados a tiempo y sean tomadas las medidas terapéuticas necesarias, puedenexistir complicaciones que afectaránel resto de la vida del feto, o aún resultar en muerte fetal durante el parto. Por este motivo se puede decir que existen ventajas considerables en la realización del monitoreo fetal durante el embarazo y el trabajo de parto. El principal objetivo del monitoreo fetal es el de asegurar que los órganos vitales fetales reciban unaadecuadaperfusióndeoxígeno,yque los procesosmetabólicosseanprocesados sin compromiso y, por lo tanto, lleven acabosusfunciones de la mejormanera. Es asíque, idealmente debería ser monitorizada la presión parcial de oxígeno en el sistema nerviosos central, el corazón, los riñones y el cerebro fetales. Desgraciadamente, no es posible medir estas variables directamente, o aún indirectamente en el feto in útero con la tecnología existente en la actualidad. Por este motivo, se deben buscar variables secundarias relacionadas que puedan ser monitorizadas en la práctica. Una de las variables más utilizadas en el monitoreo fetal es la FC fetal, que aunque es una variable no específica, refleja si el cerebro fetal está adecuadamente prefundido y recibiendo el oxígeno y nutrimentos necesarios. .- 1.6.1 Consideraciones fisiológicas. El balancesimpático-parasimpáticoejerceunainfluenciacontinuasobre el ritmo sinusalcomo resultado del control cardiovascular. Las principales fluctuaciones periódicas se originan debido a los controles respiratorio, de bar0 reflejos ya los mecanismos de termorregulación.Otros mecanismos fisiológicos que han sido estudiados en el feto humano son los ritmos ocasionados por etapas de comportamiento, patrones de movimiento, ciclos circadianos y efectos de la edad gestacional.Dicho de otramanera, elfeto respondeadiversosestímulosconcambiosen la frecuencia cardiaca, el movimiento fetal suele acelerar en forma transitoria la FC, mientras que otras acciones como el rascarse o frotar el abdomen, orinar o asir el cordón umbilical la disminuyen brevemente. Estos eventos son respuestas de estrés a estímulos fisiológicos leves. El mecanismo que controla las variaciones dela FC fetal es el sistemanerviosoautónomoysuinervación cardiaca. El desarrollofuncionalocurre de maneralentay en el feto humanosedesarrollaun control autonómico considerablede la FC a partir del tercer trimestrede gestación. El balance entre los componentessimpáticoyparasimpáticodelsistemanerviosoautónomocontribuyenauna variabilidad latido a latido. El tomo vagal, con actividad cardio-desaceleradora, tiene un efectomás rápido en el corazón que la actividad cardio-aceleradora simpática. El análisis de la FC fetal consiste en tratar de identificar todas las características de un trazo de la FC. En la práctica clínica es común identificar distintos componentes: la FC basal, los periodos de aumento de la frecuencia o aceleraciones (también llamados patrones reactivosde la FC), que por lo general son signos de salud fetal; periodos de disminución de la frecuencia o desaceleraciones, que podrían serde origen mecánico o químico y que generalmente ameritan atención especial; lay variabilidad de la frecuencia cardiaca, entre otros. INTRODUCCION 1.7.- JUSTIFICACIóN DEL PROYECTO. Como ya se ha explicado, existen diversos factores que actúan sobrela propiedad cronotrópica del corazóndel feto ocasionandoque la frecuenciacardiaca (FC) presentaciertospatronesde aceleración, desaceleración, variaciones de corto y largo plazo. La información que proporcionan estos patrones hacen posiblela identificación de condiciones de riesgo que orientanal médico para actuar oportunamente en el manejo o terapia más adecuada para prevenir o limitar agresiones hacia la madre o el feto. Desde que se descubrió quelos patrones de la Frecuencia Cardiaca Fetal pueden discriminar alos fetos sanos de los fetos que presentan amenaza de hipoxcemia o acidemia, el análisis ante parto de la Frecuencia Cardiaca Fetal se convirtió en una pruebaútil para la valoración del bienestar del feto. Las técnicas de obtención de la frecuencia cardiaca fetal pueden ser clasificadas en directas e indirectas. Las primeras consisten en procedimientosinvasivos enlos que el transductor debe estar en contacto con el feto para obtener la frecuencia cardiaca fetal y las últimas son procedimientos relativamentenoinvasivos en los que la madresirve como intermediarioentre el feto y el instrumento electrónico. Los métodos indirectos de detección de la FC fetal miden variables fisiológicas relacionadas con los latidos cardiacos fetales detectados desde la superficie del abdomen materno. A diferencia del electrodo utilizado para el registro del electrocardiograma fetal (FECG) que debe estar en contacto directo con el fetoy , por lo tanto, es necesario que haya comenzado la etapa de trabajo de parto, o bien, se realiza pasando un alambre a través de la pared abdominal materna, la cavidad uterina y traspasar la piel fetal. Esta técnica pone en riesgo tanto a la madre como al feto y no es aplicable como un procedimiento de rutina. A pesar de la agresividad de las técnicas directas de obtención de la FC fetal, estas son las que proporcionan mejores resultados y por lo tanto las más utilizadas durante el trabajo de parto. Esto se debe a que las técnicas indirectas, como el electrocardiograma abdominal, pueden presentar una relación señal a ruido muy baja debido a que la señal de interés es muy débil y requieren etapas de procesamiento de la señal más complejas. La FCF generalmente se detecta y se computa mediante la auto correlación de la señal fetal de ultrasonido Doppler, sin embargo, esta técnica de monitoreo no invasivo no es capaz de detectar de forma precisa la variabilidad de corto plazo. Además, puede producir registrosde aceleraciones o desaceleraciones que no son reales, y puede malinterpretar los cambios abruptos en la seAal considerándolos como ruido. La señal de ECG abdominal (ECGa) también puedeutilizarse para la determinación no invasiva de la FCFantepartoatravés dela deteccióndepotencialescardiacosfetalespequeñosen la superficie del abdomen materno. A pesar de que esta información proporciona una resoluciónmás satisfactoria, frecuentemente presenta interferencia del ECG materno, ruido electromiográfico, etc. Es por esto, que para obtener una señal de ECG abdominal adecuada para la detección del ECG fetal, se debe mejorar la relación señal a ruido. La tarea de procesamiento más crítica para esta mejora es la reducción o eliminación de los complejos QRS maternos, debido a que presentan un traslape en tiempo y frecuencia conlos complejos QRS fetales. INTRODUCCION Las principales ventajas del monitoreo fetal utilizando el electrocardiograma abdominal son que no es invasivo, no representa riesgo para el paciente, utiliza transductores económicos, permite tener unconocimiento1 de los valores de FC en etapas tempranas de la vida del feto y auxilia en el diagnostico de sufrimiento fetal crónico. Las ventajas de la técnica indirecta de electrocardiografía abdominal para la obtención de la FC fetal con respecto a las técnicas directas, justifican el desarrollo y optimización de métodos para el procesamiento de la señal de ECG abdominal. 1.8.- ANTECEDENTES. El Cardiotacograma fetal (CTGr), como una herramienta de diagnóstico, proporciona información sobre la variabilidad de lafrecuencia cardiaca fetal (VFC,). El CTGf puede generarse apartir de una señal de ECG fetal y una forma de obtener el ECG fetal es el ECG abdominal (ECGa). Para el caso de una señal de ECGa la relación señal a ruido (S/R) es muy pobre y existe traslape en tiempo y frecuencia de los complejos QRS fetales con los complejos QRS maternos. Por esta razón la obtenciijndel ECG y del CTGfetales, a partir de una señal abdominal materna sedificulta. Existeninvestigaciones en las quesereportandiversasformas de realizar la adquisición del electrocardiograma fetal y el procedimiento para la eliminación (o reducción) de la señal materna. Eisenberg et al. [I9721 propone una técnica de registro multielectrodo (4 electrodos abdominales) con el fin degarantizarque no haya latidos perdidos(comosedaencasosderegistros de electrodo Único). Abboud et al. [I9921 desarrollan un sistema en el que logran la eliminación de la señal materna existente en el registro abdominal. La técnica está basada en la generación de una forma de onda de ECG materno promediado (que funciona como plantilla) y que posteriormente es substraída de la señal abdominal. La técnica de alineación para generar la plantilla se basa en la función de correlación cruzada. Callaerts et al. [I9861 desarrollaronunmétodoadaptivoentiempo real de extracción del electrocardiograma fetal completo de un registro multielectrodos. Este método esta basado en un análisis matemático (geométrico) de las tres señales generadas por electrodos conectados en la superficie cutánea abdominal. Vanderschoot et al. [I9871presentan dos técnicas basadas enla descomposición del valor singular de una matriz demedición. Una de las técnicas se realiza fuera de linea, laotra en tiempo real y se garantiza una buena eliminación del ECG materno sitres de los electrodos empleados se localizan en el tórax. Bergveld et al [I9811 describenunatécnica de eliminaciónbasadaen al optimización de un procedimiento en el que se realiza la multiplicación de coeficientes de seis señales abdominales independientes que se suman entresí. En 1996, Echeverría et al [ I ] propusieron un método para procesarel ECG abdominal y extraer los complejos QRS fetales obteniendo así la localización temporal de la onda R. Este método constó de dos etapas: la primera consiste en una etapa de preprocesamiento para la supresión de ruido aditivo de baja y alta frecuencia basado en una descomposiciónmulti resolución wavelet optima, y en la segundaetapasecancelan los complejosQRSmaternosmediante la comparación, identificaciónysubstracción de patrones.Posteriormente,mediante la aplicación. delalgoritmo propuestoporPanyTompkinsen1985 [3] sedetectaron los picos de las ondas"R"de los complejos fetales. Losresultadosobtenidosenesteúltimo trabajo, mostraron la confiabilidaddelmétodopara la supresión de complejosQRSmaternos. Sin embargo,debidoaque el métodosomete al reconocimiento de patrones a todos los complejos maternos (presenten traslapeo no), requiere de un tiempo de procesamiento elevado. En 1998, Salinas et al [2] propusieron y evaluaron un procedimiento para la identificación de complejos maternos conflictivos (traslapados con complejos fetales), esto con el fin de aplicar el reconocimiento 'de patrones sólo a los complejos conflictivos. El procedimiento se basóenlos cambios de amplitud generados por los complejos QRS fetales al estar traslapados con el complejo QRS materno. Como resultado se obtuvo un procedimiento confiable en la identificación de complejos confli8ctivos.Sin embargo, al igual que en el caso de Echeverría et al, no se toman en cuenta los cambios morfológicos en la señal a lo largo del tiempo y pueden generarse errores de identificación en registros prolongados. tn I .9.- HIP~TESIS. Basándonos en e 1 método propuesto por Echeverría et al y en los resultados obtenidos por Salinas et al. En el presente trabajo, seproponeunametodologíaalternativapara la supresión de complejos QRS maternos y obtención de un CTG fetal. El método utiliza un procedimiento de análisis de cambio en amplitud de la señal para identificar a los complejos no conflictivos y construir, a partir de estos, un patrón que se adapta a los cambios de la señal materna a lo largo del tiempo. 1.IO.- OBJETIVOS: Los objetivos de este trabajo son: 0 Crear una interfase amigable con de ECG abdominal. el usuario mediante la cual se puedan procesar las señales 0 Reducir el tiempo de extracción de complejosQRS fetales, sin sacrificar la confiabilidaddel método. Generar un método que se adapte a los cambios morfológicos de las complejos QRS a lo largo del tiempo. METODOLOGIA METODOLOGíA 2.1.- DESCRIPCIóN DEL PROCEDIMIENTO. Para el procesamiento de la señal en el presente trabajo, se utilizó la plataforma de programación MatlabB, Esta plataforma ofrece ventajas en el procesamiento de señales digitales, manejo de flexible sobreinterfaces de usuarioenun matrices,arreglos y gráficas, y permiteunmanejo ambiente Windows desde una PC. Todas las rutinas y procesos realizados se encuentran debidamente documentadosen el Apéndice de este trabajo. Para la descripcióndelprocesoquese realiza para la obtencióndelCTG fetal se utilizan diagramas deflujo queexplican de maneraclaracadauna de las etapasdelproceso y se presentan figuras que muestran el estado de la interfase con el usuario en cada etapa del proceso. En cada uno de estos diagramas se presenta de manera global el flujo de operaciones realizadas, y se especifica que operaciones requieren de la intervención del usuario, así como procesos de toma de decisión.Losdiagramas deflujo nosondiagramasdescriptivos de las rutinas programadas, sino que son esquemas que muestran paso a paso el proceso completo de forma genérica. El proceso Comienza cuando se invoca, desde ‘matfwav.m’ la ventana de comandos de MatlabB, a la función En la siguiente página se presenta el diagrama de flujo del proceso completo de la obtención del CTG fetal a partir de una señal de ECG abdominal. 20 METODOLOGIA Filtro y normalización de la c""""""""""""""~ Obtención del CTG fetalporelmétodode Complejo Característico Adaptable (CCA). .'\ '; I I 1 \ / 1 Selección de 3 complejos maternos limpios. 1 J. Obtención del patrón fetal. ,/ Localización de las2 primeras ondas R de los complejos maternos enlos 5 I Selección de 3 complejos fetales limpios. Obtención del patrón materno. 1 I I ! I I I I 1 I I ! limites temporales adaptivos. I I I I Evaluación del resuitado de la búsqueda de complejos. I I I I I I I I I .1 I I Construcción de la librería I 7-A 1 I J. Selección del nivel de desplazamiento y ajuste de los límites del patrón materno. I I I I I I I I I I I I I I I I I I Eliminación delos complejos maternos de la setial actualizando el patrón o complejo característico materno. Localización de los complejos I I I I I I I I I Construcción del cardiotacograma I I \ \ \ I. , """"""""~"""""""~~ Diagrama 2.1.1: Proceso completo de obtención del CTG fetal a partir del ECG abdominal. En el diagrama 2.1.1 se puede observar del lado derecho el proceso de Obtención del CTG fetal por el método de Complejo Característico Adaptable (CCA), que es el proceso propuesto en el presente trabajo, este proceso se considera como un proceso alternativo al proceso propuesto por [Echeverría et. al.] en 1996 [I], sin embargo los procesos de seleccióndecomplejosfetales y maternos limpios se utilizan también en el proceso alternativo. A continuación se describen cada uno de los procesos de este diagrama. 21 I ..................... ; ObtencióndelaseñaldeECGabdominal I I r I I I I I I Creación de interfase de usuario I I I I I I I Selección de tipo de archivo donde se encuentra la señal de ECG abdominal I I * L 1 Nombre y ruta de acceso Lectura de datos del archivo y se obtiene la señal en un arreglo I "_ """"""_ "" I I I I I I I I I I I II I I I I - " " " _" " I I I I ." . _ """_ " Filtrado y normalización de la señal. I I v Análisis y síntesis de los filtros correspondientes a un esquema biortogonal con wavelets spline de soporte compacto I Analisis de multiresolición con 1O detalles Del análisis se descartan las primera y últimas 3 bandas para eliminar ruido de baja y alta frecuencia I I Del análisis se obtienenlos coeficientes de la ecuación de diferencias para elfiltro I I Filtrado y normalización de la señal 1 ención de los patrones maternoy para la construcción dela librería ~ Diagrama :!.I2 Procesos de obtencion de la señal de ECG abdominal, filtradoy normalización de la señal. 22 METODOLOGIA La primera parte del proceso es la obtención de una señal de ECG abdominal, lo primero que se hace es presentar una interfase de usuario que facilita el acceso a documentos o archivos que contengan la información dela señalquese utilizará’. LaFigura 2.1.1 presenta la interfase utilizada para este caso. En la figura 2.1.2 se presenta le submenú para la selección del tipo de archivo,cundoseseleccionaun tipo dearchivo segeneraunainterfaseperaseleccionar la frecuencia de muestreo (Fig. 2.1.3). Figura 2.1.2: Submenú para la selección del tipo de archivo Figura 2.1.3: lnterfase para laselección de la frecuencia de muestreo ’ Las funciones en lenguaje MatlabB, involucradas en este proceso son: ‘matfwavm’,‘elefrel .m’,‘elefre2.m’, ‘leartm’,‘1earb.m’y ‘guard1.m’.(ver Apéndice) 23 MFTODOI OGlA Una vez seleccionada la frecuencia de muestrosepulsa el botón “Abrir” paraproporcionar el nombre del archivoy la ruta de acceso para estearchivo (Fig. 2.1.4) ‘La función en lenguajeMatlab@, donde se realiza el filtrado de la seiial es: ‘guard1.m’.(ver Apéndice) a4 METODOLOGIA AI pulsar la opciCln “Filtrar” se realiza el proceso de filtrado2 descrito en el diagrama 2.1.2, para este los propósito se utilizó la teoría de descomposiciónwaveletmultirresoluciónysurelacióncon bancos de filtros. El algoritmo de banco de filtros se basa en la descomposición de una señal en regiones de frecuencia especificas mediante el análisis de un conjunto de filtros. Cada una de las sub-bandas de frecuencia se procesa en forma independiente y finalmente la señal se reconstruye a partirdelassub-bandasprocesadasmediante la síntesisdeunconjuntodefiltros [5].Un algoritmo de banco de filtros está relacionado conla descomposición multirresolución de una señal por medio de la transformada “wavelet”. Para este proceso se utilizaron las funciones ‘wsp1ine.m’ y ‘mu1tires.m’ de MatlabB desarrolladas en la Universidad de Vigo [8]. La función ‘wsp1inw.m’ realiza el análisis y la síntesis de los filtros correspondientesaunesquemabi-ortogonalconwaveletssplinedesoportecompacto.Esta función recibe la cantidad de ceros en z=-I requeridos para el análisis y la síntesis del filtro pasabajas (m y n respectivamente).El par de valores m-n para los cuales resultó una mejor limpieza de unconjuntodeseñalesde ECGa fuede m=7 yn=21 [5]. Porotrolado, la función‘mu1tires.m’ realiza un análisis multi-resolución, esta función recibe el análisis y la síntesis de los filtros que proporciona la función ‘wsp1ine.m’ y el número de detalles que se usaran para el análisis, en este caso se utilizaron 10 detalles. La reconstrucción de la señal se hace descartando las primeras y últimas 3 bandas., eliminando ruido de baja yalta frecuencia. Como resultado, se presenta en la gráfica la señal filtrada, y se presentan los botones “Limpiar” , “Librerías” y el submenú “Patrones” (Fig.2.1.6). El siguiente paso del proceso es la obtención de complejos maternos y fetales sin traslapamiento para la obtención de patrones de los complejos maternos y fetales. A continuación se presenta un diagrama de flujo que muestra el proceso de patrones materno y fetal. la obtención de los METODOLOGIA 7 I Filtrado y normalización de la señal. """"""""""""-" // Selección de 3 complejos limpios I I I los :3 primeros segundos de la señal para la búsqueda de I I I I I I I I I I I I I I \ \ I I \ \ I I I I Se almacena la posición del complejo I I I I I I I I A ,' I I I I I \ I \ \ I I \ \ \ \ I I I I \ I fetal patrón Obtención del / -- - - --- - - - - - - . / I - - Obtención delpatrónmaterno / \ I I Se busca complejo el fetal con mayor númerodemuestrasyapartirdeeste,se mismo elda les tamatio (número de muestras) a los 3 complejos fetales. I I I I I I I I \ I I I I I I I I I I 1 I 1 I 1 I I I I I les da el mismo tamatio (número de muestras) alos 3 complejos maternos. I I I I I I I I I complejos, alinelndolos de acuerdo la a máxima correlación entre ellos. Se calculan nuevos límites para los 3 patrones agregando secciones de señal antes y después de cada complejo. I I I I I I I I I I I I I I antes despues y de cada complejo. I I . . I I señal \ \ \ . I I I i Se promedianlos 3 complejos maternos paraformarelpatrónmaternode la setial fetales para patrón ser el fetal la de I I I " " " " " " " " r .' I , , ~"""""""""""""""~ que se agregaal patrón para obtenerlos límites finales a partir de las posiciones donde librería Diagrama 2.1.3: Obtención de los patrones materno y fetal para la construcción de la librería 20 METODOLOGiA Paracontinuarcon el procesosepulsa el menú“Patrones”quepresentaunsubmenúcon las opciones “Materno” y “Fetal” (Fig. 2.1.7), estas opciones presentan asu vez un menú con la opción “Selección” (Fig. 2.1.8 y Fig. 2.1.9). nl; Figura 2.1.7. Submenú de la opciónPatrhes Figura 2.1.8. Submenú de la opción “Materno” Figura 2.1.9. Submenú de la opción “Fetal” Enla primeraparte del proceso de obtencióndeunpatrónseseleccionan3complejossin o fetales, esporesoque, en el diagrama 2.1.3, el traslapamientoyasencomplejosmaternos proceso de selección de complejos “limpios” es el mismo para los complejos maternos y fetales’. AI pulsar la opción “Selección” se presenta una ventana con la gráfica de los 3 primeros segundos de la señal y el usuario decide si desea ver la siguiente sección de la señal o si desea seleccionar un patrón quede acuerdo a su criterio no tenga traslapamiento(Fig. 2.1.IO). Si el usuariodesea vermás señal,sepresentan los siguientes 3 segundosde la señalen la gráfica, si por el contrario, el usuario cree que se puede seleccionar un complejo en el tramo de señalqueseobserva enla gráfica, sepresentauna rejilla o “grid” en la gráficay el botón “Continuar” aparece en la ventana, en este momento el usuario con el uso del “ratón” o “mouse” de la PC puedeseleccionar el tramo de la señaldonde se encuentra el complejo de interésy al presionar el botón “Continuar” se hace un acercamiento o “zoom” sobre esa región. Repitiendo el mismo procedimientoseseleccionaahora,únicamente el complejo “limpio”(Fig. 2.1.11y Fig. 2.1.12). Las funciones en lenguaje Matlab@, involucradas en este proceso son: ‘wn2.m’, ‘patmatm’, ‘patfetm’ y ‘segmenta.m’. (ver Apkndice) 27 METODOLOGíA 28 METODOLOGIA Cuando se selecciona el complejo y se pulsa el botón “Continuar” se almacena la posición del complejo y regresamos a la ventana de la figura 2.1.1O, todo el proceso se repita hasta seleccionar 3 complejos sin traslapamiento. La obtención del patrón se realiza a partir de los tres complejos maternos o fetales que se hayan seleccionado. Lo siguiente es obtener el patrón materno o fetal ‘, sin embargo, el patrón materno no se obtiene de la misma forma que el patrón fetal por lo tanto, como se puede observar en el diagrama 2.1.3, se realizan dos procesos distintos. Para el patrón Materno se selecciona la opción “Promedio” en el submenú ”Materno” (Fig. 2.1.8) y para el patrón Fetal se selecciona la opción “Mejor señal” en el submenú “Fetal” (Fig.2.1.9). Para el caso del patrónMaternose realiza el procesodescrito como “Obtencióndelpatrón materno” en el diagrama 2.1.3 y se presenta una ventana con la gráfica del promedio de los 3 complejos seleccionados donde el usuario selecciona, conel uso del “mouse” de la PC, un nivel de offset o desplazamiento para encontrarlos límites finales del patrón (Fig. 2.1.13). En esta última gráfica se presentan en color azul las secciones de la señal que no pertenecen al promedio de los 3 complejos y el programa automáticamente selecciona el inicio y final del patrón, en donde el offset o desplazamiento seleccionado se intersecte con estas secciones. AI pulsar continuar en esta ventana, se presenta otra ventana con 2gráficas, una presenta los tres complejos seleccionados y la otra presenta el patrón Materno (Fig. 2.1.14). Las funcione:s en lenguajeMatlab@, involucradas en este proceso son: ‘matfim’,‘fetalfi.m’, ‘a1inea.m’ y ‘centram’. (ver Apéndice) 29 30 METODOLOGIA Para el caso del patrón Fetal se realiza el proceso descrito como “Obtención del patrón fetal” en el diagrama 2.1.3, en el cual, se presenta una ventana con la gráfica con los 3 complejos fetales seleccionados donde el usuario selecciona, de acuerdo a su criterio, el mejor o más representativo complejo de los 3 (Fig. 2.1.15). AI seleccionar “Continuar” se presenta una ventana con la gráfica del complejo seleccionado donde el usuario selecciona un nivel de offset o desplazamiento para encontrar los límites finales del patrón al igual que para el caso del patrón materno(Fig. 2.1.16). 31 METODOLOGíA AI pulsar “Continuar”en esta última ventana se presenta otra ventana conla gráfica del patrónfetal (Fig. 2.1.17). Ahora al pulsar “Continuar” el programa regresa a la ventana de la figura 2.1.6. Para continuar, se pulsa la opción “Librería” donde se construye la librería de las señales de traslapamiento ’, esta librería se utiliza para la identificación de los cambios morfológicos existentes en el complejo QRS maternocuandoéstecoincideconuncomplejoQRS fetalcomo fuedescritoen1996por Echeverría et al [I]. Las señales de traslapamiento se generan sumando el patrón materno y el patrón fetal muestra a muestra. AI terminar la construcción de lalibrería, se presenta una nueva ventana conlos botones “Graficar”, “Cerrar” y el menú “Selección de picos” (Fig. 2.1.18). AI presionar el botón“Graficar”sepresent.anen señales de traslapamiento de la librería ‘. la gráfica, en forma de secuencia,todas las La función en lenguajeMatlab@, donde se realiza este proceso es: ‘bib1iorn.m’. (ver Apéndice) ‘La función en1 lenguaje Matlab@, donde se realiza este proceso es: ‘t0das.m’.(ver Apéndice) METODOLOGIA A partir de la señal filtrada y normalizadaqueseobtuvo al principio delprocesose realiza la obtención del cardiotacograma (CTG) fetal por el método del Complejo Característico Adaptable (CCA) propuesto en estetrabajo. A continuación se presenta el diagrama de flujo de los 2 primeros procesos de este método, la localización de las 2 primeras ondas R de los complejos maternos en los 5 primeros segundos de la señal y la búsqueda de complejos mediante límites temporales adaptables. METODOLOGIA * señal. Localización de las2 primeras ondasR de los complejos maternos enlos 5 primeros segundos dela señal """""""""""~""""""""""-""- r""""""""""""""""""""""""I I I I Búsqueda de complejos mediante límites temporales adaptivos. I I I I Localización de los picos de la señal utilizando 2 umbrales distintos. I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I Búsqueda de la siguiente onda R en la setial utilizando el mayor del o s umbrales y límites temporales. I Se almacenala posición de la onda R. I I I I I I I I PROM2:=PROM1. ¿Se encontraron 8 intervalos no regulares consecutivos? incrementando señalla los límites temporales. I I I I I PROMI: Promedio de los 8 I Seactualizaelpromedio de intervalos PROM1. I I I I I I I I I I I I I I I I - I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I Se actualiza el promedio de intervalos regulares PROM2. I I I I I I I I PROh12: Promedio de los 8 últimos intervalos regulares I I últimos L I I I I I I I I I I I I I I I I I I I I I I Búsqueda de la siguiente onda R en la señal utilizandoel menor de los umbrales. I I I I I I I I I I I I I I I I I I I I I I I I I Diagrama 2.1.4: Búsqueda de complejos maternosen la setial 34 AI pulsar la opciiin “Selección de picos” en la ventana de la figura 2.1.18, se presenta una ventana con la gráficadel patrón Materno (Fig. 2.1.1Y) en donde el usuario debe seleccionarla polaridad de la onda R de los complejosmaternos 7 , estocon el fin de especificarsisebuscaranondas R positivas o negat:ivas. Una vez seleccionada la polaridad de la onda R del complejo materno y al pulsar “Continuar” se toman los 5 primeros segundos de la señal para encontrar los 2 primeros complejos maternos8. Para encontrar la localización de las ondas R en los 5 primeros segundos de la señal, cada unade las muestras de este tramo inicial deseñal se elevan alcuadrado para aumentarla diferencia entre ellas y el umbral que se toma para detectar los “picos” u ondas R en la señal, es de dos veces el valor medio delas muestras del segmento elevadoal cuadrado. En caso de que el periodo entre el posible primer complejo materno yel posible segundo complejo maternos sea menor a 300ms, que es el periodo refractario, se busca un tercer posible complejo queseencuentredespués de esteperiodo,yseconsideraaesteposiblecomplejo comoel segundo compkjo de la señal. De esta forma se obtiene la posición de los 2 primeros complejos maternos en la señal. El siguientepasodelprocesoes la detección de los picosen el resto de la señalutilizando2 umbrales de detección distintos ’, a continuación se describen estos 2 umbrales. Umbrall: Es el valor promedio de todos los picos que se encontraron enla señal. Umbral2: Es el valor promedio de todos los picos de la señal mayores a Umbrall. Umbral3: Umbral2 menos dos vecesla desviación estándar de todoslos picos mayores a Umbral2. De esta forma, Llmbrall y Umbral3 se consideran como los umbrales de detección menor y mayor respectivamente. La función en lenguaje Matlab@, donde se realiza este proceso es: ‘po1picam.m’. (ver Apéndice) 36 METODOLOGIA La siguiente parte del procesoes la búsqueda del siguiente complejo maternoen la señal para esto se utilizan los umbrales descritos anteriormente y limites temporales adaptables como se muestra en el diagrama 2.1.4. Para definir los liimites temporales que seutilizan, se definen primero dos promedios: PROMI: Promedio de los 8 últimos intervalos RR en la señal PROM2: Promedio de los 8 últimos intervalos RR en la señal que caen dentrode ciertos límites. La razón para tener estos dos promedios es para hacer que el algoritmo se adapte rápidamente a los cambios en la señal. Los intervalos que se seleccionan para PROM2 son intervalos que caen dentro de límites aceptables (superior e inferior) de intervalos RR, estos límites son: Límite inferior = 85% de PROM2. Límite superior := 125% de PROM2. Límite inferior = 300ms despuésdel último complejo. Límite superior := 170% de PROM2. En este caso el límite inferior se encuentra después del periodorefractario del corazón, puesto que durante este periodo es fisiológicamente imposible que se presente un latido. Si los últimos 8 intervalos que se encuentran caen fuera de los limites iniciales de búsqueda, el valor de PROM2sesubstituyepor elvalorde PROMI, quees el promedio de los últimos 8 intervalos que se encuentren. De esta manera se buscan todos los complejos maternos en la señal y se presenta una ventana con la gráfica de los 5 primeros segundos de la señal indicando con asteriscos rojos las posiciones de las ondas R en la señal (Fig. 2.1.20). La funcion en lenguaje MatlabB, donde se realiza este proceso es: 'detpicarnm'. (ver Apéndice) Las funciones en lenguaje Matlab@, involucradas en este procesoson: 'detpicamm' y 'rrprornm'. (ver Apéndice) METODOLOGIA La siguiente parte del proceso es la evaluación del resultado de la búsqueda de complejos,es esta parte se revisa la posición de los complejos maternos en la señal en busca de posibles complejos no detectados o complejos detectados erróneamente. A continuación se presenta un diagrama de flujo del proceso de la evaluación del resultado de búsqueda de complejos. la 37 METODOLOGIA las 2 primeras ondas R en los 5 primeros segundos de la señal límites temporales adaptivos. f- LJ I I I encontraron en la I I , I I I I I I I I I I I I I I I I I I I I I I I i ~"-""""""" I I I 1 I I 1 I \ *N I I I I I I I ,' I I I I \ I I I I I I I \ I I I I I I I I I I I I I I I I I i I I I I I I I I I I I I I I I I I I I I I I I I i Localización manual de los 2 primeros complejos I de todos complejos de la señal I I I I I I I I I I u ', """""""_""_"" ~------"""""""""". ' /-I I I I 1 ; .' / // I I I """"""""I Eliminación de los complejos maternos de la señal. I I I I I Posición de los 3 complejos maternos a partir de los cuales se construyo el patrón Diagrama 2.1.6 Evaluación del resuttadmk la búsqueda de complejos 38 METODOLOGiA La primera parte de este proceso es la revisión o inspección visual de la posición de todos los complejos maternos que se encontraron en la señal, esto se realiza en la ventana que se presenta en la figura 2.120,donde utilizando un control se pueden observar distintas secciones de la señal. Encasodequetodas las posicionesde los complejos maternos sean correctaselproceso de evaluación termina y se continúa con la eliminación de los complejos maternos de la señal.En caso de que la posición de los complejos maternos en la señal no sea correcta, el usuario puede seguir 2 procedimientos: Uno, en donde seeliminan y colocan manualmente las posiciones correctas de todoslos complejos maternos en la señal‘’, utilizando los botones “Quitar un pico” y “Agregar un pico” que se presentan en la ventana de la figura 2.1.20. AI pulsar, por ejemplo, la opción “Quitar un pico” se presenta en la gráfica una rejilla o “grid” y el usuario puede seleccionar con el botónizquierdo del “mouse” o ratón el pico o supuesto complejo que desea retirar (Fig. 2.1.21 y Fig. 2.1.22). ~~ 10 La función en lenguaje MatlabB, que se utiliza para eliminar y agregar picos es: ‘quipopicm’. (ver Apéndice) 30 METODOLOGIA P al AIpulsarcontinuarenesta última ventana los botones “Quitar un pico” y “Agregar un pico” aparecen nuevamente en la ventana (Fig. 2.1.23),ahora el usuario puede pulsar “Agregarun pico” y siguiendo el mismo procedimiento puede marcar con el botón izquierdo del “mouse” o ratón la posición de la onda R que no se encontró (Fig. 2.1.24). t 40 METODOLOGIA I da búsqueda La siguiente parte del proceso es retirar o eliminar todos los complejos Q R S maternos de la señal de ECG abdominal. A continuación se presenta el diagrama de flujo del proceso de eliminación de los complejos maternosde la señal. 42 METODOLOGIA Evaluación del resultado dePosición de la los 3 complejos maternos a partir delos cuales se c " " - 'I I I I I I I I I Eliminación de los complejos maternos de la seiial. I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I c L I I Se calcula la desviación estándar de las señales resultantes y el promedio 4 de estas desviaciones. 4 Se alinea cada uno delos complejos con el patrón de acuerdo a la máxima correlación y se realiza la resta muestra a muestra para cada uno de los 3 complejos. I I I I I I I I I I I I I I I I I I Se alinea el patróncon el primer complejo de la señal de acuerdo a la máxima correlación entrelos dos y se realiza la resta muestra a muestra. I I I Se alinea el patróncon el siguiente complejo de la señal de acuerdo a la máxima correlación entrelos dos y se realiza la resta muestra a muestra. * < ¿La desviación estándar del resultado es menor que el promedio de las desviaciones? y r I I I I I I I I I I I I I Se considera a este complejo "no conflictivo" se almacena la desviación estándar de la diferencia I I I I I I NO I I I I I I I I I I I I I I I I complejo "conflictivo" I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I ~ I I I I Se buscan los 3 complejos maternos a partir delos cuales se construye al patrón. I I I I I I I I I I I del complejo Se eliminan por sustracción del patrón el complejo materno de la I I I I I I I I I I I I I I I I I I I I I I I I I I I Diagrama 2.1.6: Eliminacibn de complejos maternos en la señal. METODOLOGIA Una vez localizados todos los complejos maternos en la señal, se pulsa la opción “Continuar” en la ventana que se presenta en la figura 2.1.25 esto hace que se cierre la ventana y el programa regresa a la ventanaque se presenta enla figura 2.1.6. AI seleccionar la opción “Limpiar” se realiza el proceso de eliminación de complejos maternos dela señal”. En este proceso, mediante un ciclo “for” se eliminan todos los complejos maternos de la señal, y es elproceso en donde se enfoca e! desarrollo de este trabajo. Lo primero que se hace es localizar los complejos maternos a partir de los cuales se construyó el patrón materno, estos complejos se alinean con el patrón de acuerdoa la máxima correlación entre ellos y se realiza la resta muestra a muestra entre el patrón y cada uno de los 3 complejos. Se almacena la desviación estándar que se obtiene del resultado de la resta del patrón con cada complejo y de esta manera se obtienen 3 desviaciones estándar asociadas cada una a uno de los complejos a partir de los cuales se construyb el patrón materno. Se obtienen el valor promedio de las desviaciones estándar y este valor se utilizará como criterio para determinar si un complejo se considera conflictivo (presenta traslape) o no conflictivo (no presenta traslape). Si la desviación estándar del resultado de la resta muestra a muestra entre un complejode la sefial y el patrónmaterno es menor que elpromedio quese obtuvo de las desviaciones estAndar,seconsidera que al complejo como no conflictivo o quenopresenta traslape. Esta evaluación se realiza sobre todos los complejos de la señal antes de eliminarlos y cuando se hanencontrado 5 complejos consideradosno conflictivos, seseleccionan los 3 quehayan presentado las menores desviaciones estándar en el resultado de la resta con el patrón, es decir, que seseleccionan a los 3 complejosmás parecidos al patrón materno y a partir deestos complejos se construye un nuevo patrón materno. De esta forma, el patrón materno o complejo materno característico de la señalseadapta constantemente a los cambios morfológicos de la serial de ECG materna, haciendo más confiable el proceso de eliminación de los complejos maternosen la señal. Cuando el proceso de eliminación de complejos maternos de la señal termina se presenta una gráfica de la señal sin complejos maternos y un botón con la leyenda “Pasa banda”(Fig. 2.1.26). 11 Las funciones en lenguaje Matlab@, involucradas en esta proceso son: ‘lirnpiar.rn’, ‘extra1v.m’ y ‘rnayor1vf.m’. (ver Apéndice) 44 METODOLOGIA El siguiente paso del proceso es la localización de los complejos fetales en la señal, en esta parte del programa el procesamiento que se hace sobre la señal nos permite obtener la posición exacta de las ondas R de los complejos fetales. A continuación se presenta un diagrama de flujo del proceso de la localización de los complejos fetales. complejos maternos de la setial ~"""""""""""- Localización de los I I I I I I I I I I I I I I I I I i """"~"_""""""""" .---------- - - - ------ - - - _ - _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ i Filtro I II I I I I ~ I con un filtro pasaaltas y se almacena la setial filtrada I I I I I I I I I I I I I I I I I I I I I I I I I I primeros segundos dela señal filtrada, utilizando un umbral de detección de 3 veces el valor promedio delas muestras en I I I I I I I I " " " " " " " " " " " " " " " I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I Localización de las 2 primeras ondas R I I II II II I I I I I I puntos de la setial Busqueda de complejos en la señal I I I I I I I I Localización de las siguientes ondasR en la señal fetal I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I corresponden a las 2 I I I I I I ventana móvil dela setial elevada al cuadrado y se almacena el resultado I I I I I I I I I I I I I I I I I I I I I I I I I I I cardiotacoarama 49 METODOLOGIA Hasta este momento se cuenta con una seiial abdominalque no presenta complejos maternos y a partir de la cual seobtendrá el cardiotacograrna fetal. El últirno proceso,nosaseguraque los complejos fetales antestraslapadoscon los complejosmaternosahorasepresentansinseñal materna, y es relativamente sencillo localizarlos a lo largo de la señal abdominal. Sin embargo también pueden existir complejos fetales que originalmente no presentaran traslapamiento conlos complejos maternos y para los cuales no se elimina la señal materna presente. Estos complejos fetales puedenestartraslapadoscon el registro deotros fenómenos delECGmaterno, como pueden ser las ondas P o T. Es por esto queel métodoque se utilizo para localizar a los complejos fetales no solo considera criterios de amplitud de la señal, sino que también se utilizan criterios temporales,dependiente,ancho del complejo y rangos fisiológicos paraobtenermejores resultados. El algoritmo en el que este trabajo está basado es el que presentan Pan y Tompkins (1985) 131, que presentan un análisis en varios pasos de procesamiento de la señal. AI pulsar la opción “Pasa banda” en la ventana de la figura 2.1.26 se inicia un proceso de filtrado, que es el primer paso para la localización de los complejos fetales 12. El filtrado de laseñal se realiza con un filtro pasa banda, que deja pasarel rango de frecuencias en el que la energía del complejo QRS es máxima (5 y 15Hz). Para nuestro caso se utilizaron dos filtros en cascada, un pasa altas y un pasa bajas, con esto se logró un filtro pasa banda de 5 a 12Hz que esta bastantecerca al filtro deseado. La ecuación dediferencias para el filtro pasa-bajas es: Para este caso la ganancia del filtro es de 36 y tiene un retraso de 6 muestras. La ecuación de diferencias para el filtro pasa-altas es: Y presenta una gananciade 32 y su retraso es de 16 muestras. Cuando el proceso de filtradotermina se presenta enla gráfica de la figura 2.1.26 la señalfiltrada y el botón “Derivar” (Fig. 2.1.27). AI pulsar la opción “Derivar” en esta últirna ventana, el proceso continúa en la sección indicada en la esquina inferior izquierda del diagrama 2.1.7, este es el procesamiento que se hace sobre la señal. La diferenciación (derivada) de la señal se realiza para obtener información sobre la pendiente del complejo QRS. Se utiliza una derivación de 5 puntosquepresenta la siguienteecuaciónde diferencias 13: Una vez terminada la operación de diferenciación se presenta en la ventana la gráfica de la señal resultante del proceso de diferenciación, queenadelante se denominaráseñal derivada, y la opción “Cuadratura” (Fig. 2.1.28). 12 13 Ap4ndlcr) La función en lenguajeMatlabd, donde se realiza el filtrado de la señal es: ‘pbanda.m’. (ver Apbndice) La funcidn en lenguaje MatlabQD,donde me rerllza Ir dorlvaolbn o dlkrenolroldn do Ir rofial 01: ‘dorlvclr~n’, (wr ,qi METODOLOGIA AI pulsar la opción “Cuadratura” se elevaal cuadrado la señal resultante de la etapade deri~ación‘~, est:o hace que todos los puntos sean positivos y realiza una amplificación no lineal de la derivada, enfatizando las frecuencias altas (i.e., fundamentalmente las frecuencias del ECG). AI igual que para la diferenciación, alfinalizar este procesose presenta la gráfica de la señal resultante y ahora se presenta la opción “IVM” (Integración de Ventana Móvil) (Fig. 2.1.29), que es el siguiente paso del proceso. I I - I AI pulsar la opción “IVM” en esta última ventana, se realiza una integración con ventana móvil de la señal para obtener información de la forma de onda de ECG y de la pendiente de la onda R15. El número de muestras que se utiliza para la ventana de integración debe ser aproximadamente el mismo número de muestras del complejo QRS más ancho que exista en la señal. Para el caso de la señal fetal se encontró que el ancho de ventana más adecuado es de 60ms. AI igual que en el caso de la diferenciación de la señal, para poder realizar la integración se aplica un filtro digital con coeficientes relacionados con el ancho de la ventana de integración. Este filtro se puede describir con la siguiente ecuación: y@-)= - [x(nT-(hr-1)T)+x(nT-(N”2)T)+ .........+x(nT)] Donde N es el número demuestras de la ventana de integración. Como resultado se presenta en la ventana la gráfica de la señal integrada (Fig. 2.1.30). La relación entre la forma de onda resultante de la integración de ventana móvil y el complejo QRS fetal se presenta en la figura 2.1.31. 14 M La función en lenguaje Matlab@, donde se eleva al cuadrado la señal es: ‘cuadram’.(ver Apéndice) La funalbn am IangumJeMatlrb@,denda ea raellre le lntrgretrl&l €IC! le sefiel ea: ‘fflW1nt:ffl’: (Wt ApfkidlHl Figura 2.1.31. Relación del complejo QRS con la forma de onda de la integración con ventana móvil. (a) señal de ECG.(b) Salida del proceso de integración con ventana móvil, QS: Tamaño del complejo QRS, W : Tamaño de la ventana de integración. 50 METODOLOGíA El complejo QRScorresponde a la pendienteascendentede laforma deondade la señal integrada. La duración en tiempo de esta pendiente es igual al ancho del complejo QRS. De esta manera, al buscar los complejos en la señal integradase pude encontrar un marco de referencia de la localización exacta de los complejos en la señal filtrada. El procesamiento sobre la señal termina una vez que se ha integradola señal derivada. Como se puede observar en el diagrama 2.1.7, para continuar con la localización de los complejos fetales se buscan los picos en los 3 primeros segundos de señal filtrada que puedan corresponder a las ondas R fetales en este intervalo. AI pulsar la opción“Ondas R”en la ventana de la figura 2.1.30, se presentauna figura con la gráfica del complejo fetal utilizado para la construcción de la librería (Fig. 2.1.32) y es aquí donde se recibe la información por parte del usuario sobre la polaridad de la onda R del complejo fetal16. La información que proporciona el usuario se utiliza para que el algoritmo busque en la señal ondas positivas o negativas. AI pulsar “Continuar” en esta última ventana, se presenta la gráfica de los 3 primeros segundos de la señalcon el resultado de la búsquedade los picos en este intervalo (Fig. 2.1.33).Enesta ventana el usuario proporciona, de ser necesario, la localización de los dos primeros complejos fetales en la señal, utilizando las opciones “Quitar un pico” y “Agregar un pico” descritas anteri~rmente’~. 16 - La función en lenguaje Matlab@, donde se realiza este proceso ’po1pif.m’. es: (ver Apéndice) 17 Las funciones en lenguaje Matlab@, dondese realiza este proceso son: ‘pini.m’y ’qppfm’. (ver Apéndice) METODOLOGiA I La siguiente parte del proceso es la búsqueda de complejos en la señal integrada. A continuación se presenta un diagrama de flujo que describe el proceso de búsqueda. J METODOLOGíA p"""""""""~.""""""""""""""~"""""""""" I Localizacitjn en la señal integrada de los picos correspondientes a los 2 primeros complejos fetales. correcciónla de posición de los 2 primeros complejos _ j A partir del primer intervalo RR, en la setial integrada, se obtienen los límites temporales búsqueda. de I I I I I I I Se construyen los umbrales de Se obtiene valor el y posición la de detección a partir delos picos en los f " todos los picos de la setial primeros 1.5 segundos de la setial. integrada en los primeros 1.5 segundos I-" I I I Búsqueda de los picos en la señal integrada utilizando límites temporales. I I I I < dePROM2: la Promedio últimos intervalos regulares I considera Se al I Búsqueda de los complejos integrada setial los en8 I PROM1: Promedio delos 8 ÚMmos intervalos promedio el intervalos I I actualiza Se de PROMI. actualizan Se los de niveles - detección. los límites temporales. - correspondiente PROM2:=PROMI. I regulares no intervalos consecutivos? Se almacena la posición correspondiente pico del al I I I I I siguiente I I mplejo 1 I I la I I I I I I I I I I I I pueden II I I I I I I I I I I I I I I I I I I I I I I II I I I I I I I II I I Búsqueda de todos picos que corresponder al siguiente complejo. toda I I I I I I II analizado I I I I I II I I I I II siguiente menor de los umbrales. los I I - 1I I I I mayor de los umbrales. I I II ~------""""""""""""""""~"""""""""~, I * Localización de las siguientes ondas R en señal fetal Diagrama 2.1.8. Búsqueda de complejos en la señal integrada. 63 METODOLOGIA Para el proceso de búsqueda de los complejos en la señal integrada”, se utiliza el algoritmo que se utilizó anteriormente para la búsqueda de complejos maternos descrito por Pan y Tompkins en 1985 [3]. En esta parte delproceso se buscantodos los complejos fetales partiendo la señalintegrada, utilizando criterios de amplitud, temporales y de la pendiente de la onda R. Como se pude observar en el diagrama 2.1.8 para la búsqueda de un complejo se utilizan limites temporales. Para definir estos límites se utilizan 2 promedios de los intervalos entre los complejos previos o anteriores, uno es el promedio de los 8 últimos intervalos que se encontraron (PROMI) y el otro es el promedio de los últimos 8 intervalos quecaendentrode los limites iniciales de búsqueda (PROM2). Estos límites son: Límite inferior = 95% de PROM2. Límite superior =110% : de PROM2. AI incrementar los límites de búsqueda se utiliza: Límite inferior = 85% de PROM2. Límite superior =:130% de PROM2. Si los últimos 8 intervalos caen fuera de los límites iniciales, el promedio PROM2 se substituye por el promedio PROMl. Al igual que para el caso de la búsqueda de complejos maternos, se utilizan también dos umbrales de detección distintos. La diferencia de este proceso con respecto al que se realiza para los complejos maternos es que los umbrales UMBI y UMB2 no son constantes y se adaptan a los cambios que se presentan en la señal, estos umbrales están diseñados para “flotar” sobre la señal de ruido presente en la señal y se determinan de la siguiente manera: PS = O.l25*PICO + 0.875*PS PR = O.l25*PICO + 0.875*PR UMBI = PR + 0.25(PS - PR) UMB2 = 0.5*UMB1 Donde: PICO es el pico que se encontró. PS es un estimado de los picos de señal. PR es un estimado de los picos de ruido. De esta manera cadavezque se encuentre un conjuntode picos en los límites temporales establecidos, uno de estos será considerado como un pico correspondiente a un complejo en la señal filtrada y los demás se consideran como picos de ruido y se actualizan los valores de PS, PR, UMBI y UMB2. Si se encuentra un pico utilizando el umbral UMB2 el valor de PS se actualiza de la siguiente manera: PS = 0.25*PICO + 0.75*PS. Deesta manera obtienen las localizaciones de los picos en la señalintegrada,estospicos representan la localización aproximada de las ondas R, pero desplazadas a la derechaporel retrazo debido al procesamiento. A continuacirjn se presenta el diagrama de flujo del proceso de la localización de las ondas R en la señal filtradalB. 18 La función en lenguaje MatlabB, donde se realiza este proceso es: ‘enc0n.m’. (ver Apéndice) 54 METODOLOGíA Localizacióndelasondas R en la señal fetal I complejos en la señal integrada I I I I I I r------- Derivada I SI J I I I I I I I I I I I I I I complejos en la I I I I I I Señal I I I I I I I I I I I I I I I I I I I I I I I I I I I I A partir de la posición del complejo ‘T de la señal integrada, se busca, en un intervalo previo de2 veces la ventana de integración, el punto de mayor pendiente enla señal derivada I I I A partir de la posición del complejo “i” de la señal integrada, se buscan, en un intervalo previo de2 veces la ventana de integración, todos los I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I se busca (hacia adelante) el punto donde la pendiente cambia de sentido, que representa el punto de la I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I- fetal que corresponda al punto donde la pendiente de la señal derivada cambia de sentido I I I I I I I I I I I I I I I I I A Se considera como ondaR al pico más cercanoal punto donde la señal derivada cambia de sentido < correspondiente I I I I I I I Se considera que el pico I I I I I I I I I I Diagrama 2.1.9. Localizaciljn de las ondas R en la señal fetal. cardiotacograma MFTODOlLOGiA Las posiciones de los complejos encontradas en la señalintegrada funcionan como marco de referencia de la posición de las ondas R en la señal filtrada. Para encontrar la posición de cada complejo, se busca la onda R en un intervalo inmediato anterior a la posición de cada complejo de la señal integrada, el intervalo que se utiliza es de 2 veces el tamaño de la ventana de integración. En este intervalo se buscan el pico más grande para la señal derivada. Este pico corresponde a la máxima pendiente del complejo, es decir, a la pendiente de la onda R, a partir de este punto se busca a la derecha o haciadelante el primer cruceporcerode la señalderivada,estepunto corresponde, entonces, a una pendiente cero que es el punto exacto en donde ocurre la onda R. Por últirno, se considera como onda R al pico en la señal filtrada que corresponda al punto donde la pendiente es cero o donde cambie de sentido, en caso de no encontrar este pico, se considera como onda R al pico en la señal filtrada más cercano a este punto. Como resultado de la localización de los corriplejos fetales se presentala gráfica de la señal filtrada con la posición de todas las ondas R marcadas con asteriscos rojos (Fig. 2.1.34). La última parte del proceso esla construcción del cardiotacograrna (CTG) a partir de la posición de los complejos fetales en la señal. A continuación se presenta el diagrama de flujo del proceso de la construcción del CTG. METODOLOGIA las ondas R en ,/ ’. I I I I I Se calculala diferencia entra cada uno de las I I I I I \ \ \ \ \ \ I I I I I I I I I obtiene la frecuencia cardiaca latido a latido I I I I I I Se obtiene la frecuencia cardiaca en latidos por I I I I I I I \ \ \ \ \ r- I I I I I I Se presenta la gráfica de la variabilidad dela frecuencia cardiaca (CTG) \ \ \ \ \ \ \ \ I I I I I I ,, I Diagrama 2.1.10. Construcción del CTG. AI pulsar la opción “CTG” en la ventana de la figura 2.1.34 se construye el CTG’’ y se presenta una ventana con la gráfica del CTG y un botón con la leyenda “Terminar” (Fig. 2.1.35). AI pulsar la opción “Terminar” se cierran todaslas ventanas y termina el proceso. 18 La función en lenguaje Matlab@, donde se realiza este proceso ‘ctgm’. es: (ver Apéndice) 58 METODOLOGIA 2.2.- MÉTODO DE EVALUACIóN. La evaluación del proceso se realizó sobre una señal simulada de ECG abdominal, esta señal se construyó con dos señales. Una señal de ECG abdominal y una señal de ECG de adulto. Como se menciono anteriormente la señal de ECG abdominal presenta componentes deECG materno y fetal., entre otros. Poresto, la señal de ECG abdominal se procesó conel método descrito en el presente trabajo, como resultado se obtuvo una señal sin complejos QRS maternos y un Cardiotacograma (CTG) que no proporciona información importante debido a que la localización de los complejos fetales se desconocía de antemano. A partir de la señal que se obtuvo, se construyó un CTG localizando manualmente todos los complejos fetales en la señal y se consideró a esta señal como la parte fetal o señal fetal de la señal simulada de ECG abdominal. A continuación se presenta la gráfica del CTG que se obtuvo a partir de un total de 422 complejos fetales encontrados: 180 160 5o F 120 110 1O 0 90 80 O 1 I I I 1 1 I 20 40 60 80 100 180120160 140 I I Tiempo [seg] Figura 2.2.1: CTG del ECG fetal A pesar de que la señal que se obtuvo no es formalmente una señal de ECG fetal, ya que gran parte de la señal materna no fue eliminada, el filtrado que se realizó durante el proceso garantiza que lamayor cantidad de energía presente en la señal,es la energíaquecorresponde a los componentes en frecuencia del complejo QRS fetal, que es la sección del trazo del ECG fetal, que se utiliza en el proceso. Por otra parte, la señal que se utilizó como parte o señal materna para generar la señal simulada de ECG abdominal, es una señal que seobtuvo del registro de un ECG de adulto. METODOLOGIA La razón más importante por la cual se utilizaron estas señales como partes fetal y materna fue que de esta manera se pudo observar el comportamiento del proceso con señales que presentan una variabilidad en Frecuencia Cardiaca (fetal y materna) fisiológicamente real. Hay que recordarque el objetivo delpresentetrabajonoesestudiarla relación entere la variabilidad de la frecuencia cardiaca (VFC) fetaly materna, sinoevaluar el proceso, especialmente cuando los complejos fetales y maternos se traslapan, por estola VFC presente enlas señales que se utilizaron, facilita la evaluación del proceso y no se convierte, propiamente, en un factor que limite el método de evaluación. La parte materna de la señal simulada se acondicionó de tal forma que la relación Señal MaternaSeñal Fetal (M/F), en la señal simulada, fue de 9.5dB, que cae dentro del promedio de la relación MIF que se observa en los registros de ECG abdominal que se utilizan en casos de estudio[l]. A continuación se presentan secciones delas señales utilizadas para generar la señal simulada de ECG abdominal Figura 2.2.3:Setial de ECG que se utiliza como la señal materna para la construcción de la señal simulada de ECG abdominal El registro de las dos señales se realizó durante 3 minutos a una frecuencia de muestre0 de IkHz. Laseñal simuladade ECG abdominal seconstruyó sumando muestra a muestra los dos componentes. 60 METODOLOGIA A continuación se presenta una sección de la señal simulada de ECG abdominal. Figura 2.2.4: Seftal simulada de ECG abdominal Para laevaluación se generaron otras tres señales,agregando a la señal simulada deECG abdominal, 3 niveles distintos de componentes de ruido blanco Gaussiano,de esta forma se obtuvieron cuatro señales para la evaluación, una señal que no presenta componentes de ruido y tres señales con una relación S/R de IOdB, 8dB y 5dB respectivamente. A continuación se presenta una sección de las tres señales generadas. " " Tiempo [seg] Figura 2.2.5: Señal simulada de ECG abdominal con una relacion SIR de 1OdB. 4 5 1 " " 5 5 i s Tiempo [seg] Figura 2.2.6: Señal simulada de ECG abdominal con una relación S/R de 8dB. 61 METODOLOGIA 5 5 $ 5 7 3 Tlernpo [seg] Figura 2.2.7: Seiial simulada de ECG abdominal con una relación SIR de 5dB. Para las cuatro señales de evaluaciónse obtuvo la gráfica del CTG que se generó y se calculó la cantidad defalsos positivos y falsos negativos en la detección de complejos fetales. Como parteadicionaldelaevaluación se calculoeltiemporequeridoparael eliminación de complejos maternos de la señal. procesode 62 RESULTADOS RESULTADOS A continuaciónsepresenta procesaron: la gráfica del CTG que se obtuvo paralascuatroseñalesque se I80 170 i 60 *, >rO 30 I 20 IO #O 90 80 c 20 40 60 80 1O 0 12c 140 Iepl 180 $?moo [sq: Ftgura 3.1: CTG de la señal srmulada de EGG abdominal I ao 170 160 7 50 1- ." ; 140 S 130 1, ii 1 2o I 110 'I GO 90 eo Figura 3.2, CTG de la sefial simulada de ECG abdominalcon una relac on S!R de 1OdB. 63 11 i iI 4 r" I 1 Figura 3.3. CTG de la s e t i a l simulada d e ECG abdonrinal con una relación S!R de 08dE 1 a0 170 j60 " d v w !50 - i "I - : 140 - '1 130 - ' - 120 S; . l 110 - 1O 0 i 90 - 8 0 O. 20 I 40 I 6 I0 < (3 O 100 120 140 160 18@ TiZirlOm (st-g] Figura 3.4: CTG de la señal simulada de EGG abdominal con una relacidn S!R d e 05dí3. 64 Para evaluar cualitativamente el desempeña del proceso se utiliza la sensibilidad y la predictividad positiva en la delección de complejos fetales. La tabla 3.1 muestra la cantidad de Falsos Negativos (FN) y Falsos Positivos (FP), la Sensibilidad (Se) y la Predictividad positiva (P+) [4] obtenidas al aplicar el método CCA a las cuatro señales que se procesaron. 1 10 O 0.97 1.0 1 Tabla 3.1. Sensibilidad (Se)y Predictividad Positiva (P+) obtenidas al evaluar el desempeño de la metodología de extracción de picos por CCA. FN- falsos negativos, FP- falsos positivos. La tabla 3.2 muestra los tiempos de procesamiento quese obtuvieron en el proceso de eliminación de complejos maternos al aplicar el método de extracción de complejos propuesto por Echeverría en 1998 y el mismo proceso en el método de extracción por Complejo Característico Adaptable (CCA) propuesto en este trabajo sobre el mismo grupo de señales. Tabla 3.2. Tiempos de procesamiento para la eliminacl6n de complejos maternos obtenidos al aplicar dos metodologias de extracción de complejos QRS fetales en cuatro señales de ECGa con diferenteSIR. 65 DISCUS101I DISCUSI~N. AI analizar los resultados que se obtuvieronse puede decir que: De acuerdo a 10:s resultados en la Tabla 3.1, se puede concluir que el proceso de detección de complejos QRS .fetales, es confiable para los casos que se estudiaron ya que la sensibilidad del proceso fue mayor al96% para todos los casos. Paraelcasode las señalesquecontaminaronconruidoblanconoseobservaunadiferencia significativa en la sensibilidad del proceso. Para el caso de la señal a la que no se le agregó ruido blancosepresentaunamejoraen la sensibilidad de tansoloun 2% conrespectoa las otras señales. En ninguno de las cuatro casos se detectaron Falsos Positivos, ya que el algoritmo esta diseñado parabuscar un complejo utilizando límites temporalesque se generande los intervalos RR anteriores, esto d,a como resultado que la Predictividad Positiva para todos los casos sea del 100% independientemente de las relaciones S/R y IWF que se presente en la señal. A pesar de estos resultados, no hay que olvidar que para la construcción del CTG fetal se utilizan losintervalos RR de la señal fetal y queporcadaFalsoNegativo(FN)(complejodetectado erróneamente), se pierdendosintervalos RR de la señal (el intervalo entre el complejo QRS anterior y el Falso Negativo, y el intervalo entre el Falso Negativo y el complejo QRS siguiente). Es por esto, que la confiabilidad en la obtención del CTG disminuye en dos perdidos por cada falso negativo durante la detección delos complejos fetales. Esto se puede observar en las gráficas de las CTGs en donde se pueden presentar dos artefactos [5]. Uno deestos quenosondetectadosdurante el procesodelocalizacióndecomplejos artefactos, conoc:ido como el artefacto sube-baja, se presenta cuando el trazo del CTG lleva una cierta tendencia !I surge un aumento seguido de una disminución abrupta de la frecuencia cardiaca fetal; en el otro artefacto el cambioabruptoocurreprimerohaciaabajo y posteriormentehacia arriba (artefacto baja-sube).Para el primerartefactoesperaríamosqueelcomplejodebería encontrarse después y para el segundo, antes de lo detectado. AI comparar la posición de los complejos fetales que se encontraron en cada una delas señales de pruebacon la posiciónde los complejosen la señalque se utilizó comoparte fetal para la construcción de la señal simulada de ECG abdominal, se observó que la posición de los complejos que se detectaban correctamente variaba hasta en k 3ms con respecto a sus posicionesoriginales. Esta variabilidad aleatoria sedebebásicamenteaque las señalesdepruebaseconstruyeron mediante la adición de componentes de ruido blanco, señal materna y señalfetal, y a los procesos de filtrado que se realizan sobre ellas. la eliminaciónde los complejos Por otra parte,aunque los tiemposdeprocesamientopara maternos de la señal pueden cambiar ligermnente por la selección que realice el usuario de los patrones materno yfeta, la tabla 3.2 muestra que existe una diferencia considerable entreel tiempo requerido para cada método, siendo CCA quien genera los mejores resultados como consecuencia de la eliminación de la etapa de reconocimiento de patronesde traslapamiento. 66 CONCLUSIONES CONCLUSIONES. De los tres objetivosqueseplantearon siguiente: al principio del presente trabajo, sepuedeconcluir Io Por una parte, sepudocrearunainterfaseamigablecon el usuario,bajo la plataforma de programación MatlabB, que facilitó la extracción de los complejos fetales de una señal abdominal de ECG y la construcción del CTG fetal (CIG9. Se propuso, también, un método que se adapta rápidamente a 10:s cambios morfológicos de las complejos QRS maternos a lo largo del tiempo. Respectoa la c:apacidaddeextracción de complejos fetales, los resultadosmuestranque el métodoescapaz de realizar extraccionesconfiables del complejo QRS fetal ya quegenera cantidadesmínirnas de FN y FP. Sinembargo,antes de afirmar que la metodologíaes 100% confiable para la generación del CTGf, es necesario evaluarla en un espacio muestra1 constituido porseñalesadquiridasbajocondicionesrealesderelaciones S/R y M/F paradeterminar los resultados de su desempeño,por lo pronto se consideraque los resultadosobtenidosson prometedores. Como perspectivas a futuro, se propone trabajar sobre los las rutinas y procedimientos en donde interviene el criterio del usuario, con la finalidad de crear un proceso independiente del usuario que pueda extraer los complejos fetales de una señal de ECG abdominal y generar el CTG, de forma confiable y en tiempo real. 67 BIBLIOGRAFIA BIBLIOGRAFIA. [ l ] JC Echeverría, R Ortiz, N Ramírez, V Medina, R González. A Reliable Method for Abdominal ECG Signal Processing. Computers in Cardiology 1998; 25529-532. [2] Salinas E, C)rtiz R, González R, Echeverría JC. Procedimientos Para la Identificación de Complejos QRSMaternos y fetales Traslapados. Rev. Mex. lng. Biom. Nov. 1998:712-715. [3] Pan J, Tompkins WJ. A real-Time QRS Detection Algorithm. IEEE Trans Biomed Eng 32:230-236. 1985; [4] AAMI, Association for the Advancement of Medical Instrumentation. Recommended practice for testing and reporting performanceresults of ventricular arrhythmia detection algorithms, 1986. [5] Ortiz Pedroza R. Confiabilidad de la Fono cardiografía en laDeterminaciónde la Variabilidad de la Frecuencia Cardiaca Fetal por Análisis, Espectral y Temporal, 1997. [6]The MATH WORKS Inc. Using MATLABVersion 5, 1996. [7] http://www.fetal.freeserve.co.uk/ctg.html [8] http:/lwww.gts.tsc.uvigo.es/-wavelets/ APÉNDICE APÉNDICE RUTINAS Y PROCEDIMIENTOS DE COMPUTO EN LENGUAJE MATLA88 A1inea.m function lim=alinea (:sena,extremos) %FUNCIóN QUE GENERA LOS EXTREMOS DEL PATRóN %EN BASE A LA CORRELACIóN ENTRE %TRES DE ELLOS g=sena; xl=g(extremos(l):extremos(2))-g(extremos(l)); x2=g(extremos(3):extremos(4))-g(extremos(3)); x3=g(extremos(5):extremos(6))-g(extremos(5)); d=length(xl); t l 1 =extremos(1); tl2=extremos(2); s=xcorr(x2,xl); [a,b]=max(s); m=d-b; t21=extremos(3)+m; t22=extremos(4)+m; s=xcorr(x3,xl); [a,b]=rnax(s); m=d-b; t31=extremos(5)+m; t32=extremos(6)+m; %Se alinean de acuerdo la máxima correlación %el primer y segundo complejos. %Se calculan nuevos límites para el segundo complejo %Se alinean de acuerdo la máxima correlación %el primer y tercer c3mplejos. %Se calculan nuevos limites para el tercer complejo lim=[tll t12 t21 t22 r31 t321; 69 APENDICE Amp1ia.m %Se agregan ceros a la señal cuando un pico %esta cerca del inicio de la señal o cerca del final global sena1 locs limrn xa=zeros(1,300); senal=senal'; xa=[xa senal]; xa=[xa zeros( 1,300)]; senal=xa, senal=senal'; l0cs=l0cs+300; limm=limm+300; Bibi1om.m function m=bibliom(fet,mat); %Construcción de librerias a partir de patrones %materno y fetal lf=length(fet); Im=length(mat); fet=fet'; mat=mat'; fe=[fet zeros(l,Im+lf)]; %Se generan dos vectores con cada patrón (materno y fetal) feto=fe; ma=[zeros(l,lf) mat zeros(1,If)l; lon=length(fe); ¡¡=I; ¡=I: while i <= (Im+lf+l) %La librería se genera sumando los dos patrones m(ii,:)=feto+ma; %desplazando el patrón fetal una muestra a la vez feto=[zeros(1,i) fe(1,I :Ion-¡)]; ¡=¡+I: ii=ii+l; end m(ii,:)=ma; 70 Centra.m function centra(ll,bb:) %FUNCIóN QUE DEFINE LOS LiMITES DEL PATRClN global figura a b coxi linli pos band materno fetal I 1=11; band=bb; figura=figure( ... %Se presenta unanuevaventana. 'Narne','Ajuste de la linea basal.', . . . 'NumberTitle','off', .., 'position',[70 50 610 470)); ejes=axes( . . . 'Units','normalized', . . . 'Position',[O.l3 0.150.775 0.8151); a=[]; b=[l; coxf=[]; inicial=O; final=O: lin=[]; estado=[]: n=l: %Se define la función del puntero al desplazarse sobre la ventana %de tal forma que al presionar el botón de ratón se (3Imacena %la amplitud de la posición del puntero sobre la gráfica, set(figura,'units','nornlalized','WindowButtonMotionFcn',[ ,, 'global a b coxf lit1 li pos,',,,, 'a=get(gcf,"currentpoint");',. .. 'b=get(gca,"curreiltpoint");',.., ' if a(1)>0.13 & a(1)<0.905 &a(2)>0.11 &a(2)<0.925,',. . . ' set(gcf,"pointer","crosshair");', ... ' li=get(gca,"xlim");',... ' set(gcf,"WindowEuttonDownFcn","global lin,set(lin,""visible"",""off"");', ' coxf=b(3);lin=line([li(l) li(2)],[b(3) b(3)],""color"",""r"");");', ... ' set(pos,"String",num2str(b(3)));',... ' else,', . .. ' set(gcf,"pointer","arrow");', .. ' set(gcf,"WindowButtonDownFcn","");',,.. ' set(pos,"String",'"');',... 'end,']); 71 APFNDICE Centra.m (continuación) if band==l mat=materno; else mat=fetal; end tam=length(mat); eje=1:tam; %Se grafica el promediode los complejos maternos %para la selección de la línea basal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ml=rnat(l:l); ejel=l:l; m2=mat((l):(tam-l)8); eje2=(l):(tam-l); m3=rnat((tam-l):tam); eje3=(tam-l):tam; plot(eje1,ml); hold on; plot(eje2,m2,'r'); plot(eje3,m3); grid: hold on .................................................. %Se presentan 10: controles que muestranel nivel %o amplitud donde se encuentra el puntero. %%%%%%%o~%a~~%%%%%%%%Qh%%~o%~a%%c~a~%%%%%%%%%%%%%%%%a~a~%%a~%o~%~~ uicontrol(gcf,'HolizontalAlignment','right',... 'BackgroundColor',[O,8 0.8 0.81,.. . 'Style','text','Pos',[30 20 50 201,... 'ForegroundColor',[O O O], .. , 'String','Nivel:','visible','on'); pos=uicontrol(gcf,'HorizontalAlignment','left', .. '6ackgroundColor',[O.80.8 0.81,.. . 'Style','text','Por;',[80 20 70 201,... 'ForegroundColor',[O O O], ... 'String', 'visibl'e','on'); . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . boton=uicontrol(gcf, ... %Control "Continuar" 'BackgroundColor',[O O O], ... 'Style','pushbutton','Pos',[400 20 100 201,.. . 'ForegroundColor',[l 1 I], ... 'String','Continuar', 'visible','on',. . . 'callback',[... %%Función del Control "Continuar"%% 'global figura band maternofetal coxf I,',... 'if band==l,',... ' seg=materno;',... 'I, 72 APENDICE Centra.m (continuación) 'else,',.., ' seg=fetal;',. . . 'end,',... 'close(figura);',... 'seg=seg-coxf;',, , . 'Is=length(seg);',... 'secini=abs(seg((ls-I):ls));', .. 'ls=Is-I-5;',., , 'prod=seg(ls+l:I*seg(ls);', ... 'while prod>O,',... %Se busca el límite superior ' Is=Is+l;', ... %donde la señal y el umbral seleccionado 'if Is < length(seg),',... %se intersectan. ' prod=seg(ls+l)*seg(Is);', .. 'else,',, , , [x,ind]=min(secini);',... ' cte2=5;',... ' nuevo=0:l:(cte2-l);',... ' nuevo=nuevo./cte2; ' nuevo=nuevoi';', , . , ' Is=length(seg)-l+l;',... ' tor ii=l:cte2,',... ' seg(ls-ii)=seg(ls-ii).* ,,, I end,',.. ' prod=-I;',... 'end,',... 'end,',, , , 'lims=ls-l;', ... I I!... 'i=l+5;',... 'secfin=abs(seg(l:l));',.,. 'prod=seg(i)*seg(i-I);', ... 'while prodzo,', ... %Se busca el límite inferior ' i=i-l .' %donde la señal y el umbral seleccionado ' if i > I , ' , , . . intersectan. %se ' prod=seg(i)*seg(i-I);',... ' else,',... ' [x,ind]=min(secfin);',... ' cte2=5;',... ' nuevo=O:l:1:cte2-1);'. ... ' nuevo=nuelr'o./cte2;~, ,,, ' nuevo=nuevo";',, .. ' i=ind;',. , . ' Is=length(seg);',... ' for ii=l:cte2,',... seg(i+ii-l)=seg(i+ii-I).*nuevo(¡¡);',. . . ' end,',:.. ' prod=-I , , ' end,'... 'end,',, , , 'limi=i;',.,, 'seg=seg(limi:lims):',.. 'seg=[O;seg;O];',. . . 'if band==l,',... %Si se trata d e l patrón materno ' materno=[];',... %se presentala gráfica de los 3 ' materno=seg;',... %complejosy la gráfica del patrón. 3 3 . . ;I,. 73 APEPJGICE Centra-m (continuacibn) tlgure(gct);',... ' graf2=subplot(2,1,2),',. . . ' piot(maternoj,',. . . ' grid,',. ' posgrf'2=get(graf2,''pos;'),;,. , . ' set(graf2,"pos",[posgrf2(1)-.05 posgrf2(2)+.02 posgrf2(3)-.13posgrf2(4)]),',.. ' gca,',. . . ' title("Patrón Matemo","Color","k"),', ... ' 'else,',. . . %Si se trata de¡ patrón fetai ' frtal=[];',... %se presenta la gráfica del patrón fetal ' fetal=seg;',.. ' figure(gcf);',. . . ' plot(fetal),',... ' grid,',,.. gca,',... ' posgrf=get(gca,"pos"),', ... ' set(gca,"pos",[posgrf(l) posgrf(2)-.05 posgrf(3) posgrf(4)]),',... ' litle("Patrón Fetal"," Color","k"),' ,... 'end,']); I 74 APENDICE Ctg.m function ctg(lpf) %FUNCIóN QUE OBTIENE E t CTG DEL ECG FETAL %A PARTIR DE LAS POSICIONES DE LOS C0MPLE:JOS FETALES global T Ipf=lpf*T; %Se obtiene la frecuencia cardiaca a partir de %los intervalos RR. %%%%%%%%%%?~%%%%%%%%%%%%%%%%l~%%%%%%%%%%%%%%%~~O~O~ dlpf=diff(lpf); dlpf=( 1./dlpf); tac=60*dlpf; Ipf=lpf(2:length(lpf)); %%%%%%%%%%~6%%%%%%%%%%%%%%%%%%%%%%0~0~%%%%%%%%%%0~0~0~ picgr=figure('Numbei~iUe','off','Name','Cardiotacogram~~,'); %Se presenta una nueva ventana. ejes=axes( . , . 'Units','normalized', . . . 'box','on',. . . 'drawmode','fast , . . . 'Position',[O.lO 0.18 0.8 0.751); set(gca,'ylim',[80 1801); %Se presenta la gráfica del CTG. hold on, plot(lpf,tac); . . . . . . . . . . . . . . . . . . . . . . . cont=uicontrol('visible','on','position',[400 20 80 201,... 'string','Terminar.',... 'callback',['global ecgder despli,',... 'close(gcf);']); cierra %Se %Control "Terminar" la ventana. 75 APENDICE Cuadra.m function cuadra(ori); %FUNCIóN QUE ELEVA AL CUADRADO LASEÑAL global ecgcua trai despli frec, %Se eleva al cuadrado la señal . . . . . . . . . . . . . . . . . . . . . . ecgcua=ori.*2; %%%%%%%%%%~~%%%%%%%%%% tama=length(ecgcua); trai=round(2,5*frec); despli=uicontrol(gcf,':;tyle','slider', ... %Control de desplazamiento de la señal 'units','normalized',. .. 'position',[O.lO0.93 0.8 0.031,... 'min',l,'max',tama-trai,'value',l ,... 'callback',[. 'global ecgcua trai,',... 'pos=get(gco,"Value");', ... 'axis([round(pos)round(pos)+trai min(ecgcua) max(ecgcua)]);']); %Se presenta la grifica de la señal. ini=l; ¡¡=I; set(gca,'nextplot','replace'); plot(ecgcua,'b); set(gca,'xlim',[ini ii'trai]); set(gca,'ylim',[min(ecgcua) max(ecgcua)]); set(gca,'color',[l 1 l],'xcolor',[O O O],'ycolor',[O O O]); hold on xlabel('muestras','color','k'); ylabel('magnitud','color','k'); hold on . . . . . . . . . . . . . . . . . . . . . . . mwibot=uicontrol('visible','on','position',[450 80 80 20],..%Control "IMV Btring','lVIW.',... 'callback',I"global ecgcuadespli.',. , . 'delete(despli);',. . . 'delete(gco);',. . , 'mwint(ecgcua);']); %Se invoca a la funciljn 'mwint.m'. %%%%%%%%%%%%%%%%%%%%%%% 76 Derivar.m function derivar(ori); %FUNCIóN QUE DERIVA LA SEÑAL %CON UNA DERIVACIóN DE 5 PUNTOS global ecgder trai despli frec, %Derivación de la señal. %%%%%%%%%%%%%%%%%%%% I=length(ori); a=ori(1:(l-2)); b=ori(3:l); a=b-a; a=[O a O]; a=2*a; c=ori(l:(l-4)); d=ori(5:l); C=d-C; c=[O o c o O]; ecgder=(a+c)/8; %%%%%%%%%%%%%%%%%%%%%%% tama=length(ecgder); trai=round(2,5*frec); despli=uicontrol(gcf,'style','slide..r',%Control de desplazamiento de la señal 'units','normalized, ... 'position',[O.lO 0.93 0.8 0.031,... 'min',1,'max',tama-trai,'value', 1,... 'callback',[... 'global ecgder trai,',... 'pos=get(gco,"Value");', .. 'axis([round(pos) round(pos)+trai min(ecgder) max(ecgder)]);']); %Se presenta la grifica de la señal. ini=l; ¡¡=I; set(gca,'nextplot','replace'); plot(ecgder,'b'); set(gca,'xlim',[ini ¡¡"trail); set(gca,'ylim',[min(ecgder) max(ecgder)]); set(gca,'color',[l 1 l],'xcolor',[O O Oj,'ycolor',[O O O]); hold on xlabel('muestras','color','k'); ylabel('magnitud,'color','k'); hold on 77 APENDICE Derivacm (continuación) %%%%%%%Q~%%%%%%%%%%Q~%%%% cuadbot=uicontrol('vi:sible','on','position',[450 80 80 201,. . . %Control "Cuadratura" 'string','Cuadratura',. . . 'callback',['globalecgder despli,',... 'delete(despli);',... 'delete(gco);',. . . 'cuadra(ecgder);']); %Se invoca a la función 'cuadra.m' 78 APEldDlCE Detpicam.m function detpicam(se,ll,l2); %FUNCIóN QUE DETECTA LAS ONDAS R %DE LOS COMPLEJOS MATERNOS EN LA SEÑAL global h a t lifet sena1 sen tramo desp continua grafpic global locs picos popibot quipibot se grafpic T vent %Si la polaridad de1 8 onda R es negativa %se invierta la polaridad dela señal. if se==l sen=-l*senal; else sen=senal; end %Si I1=O la función $,einvocó por primera vez, %y las posicionesde los dos primeros complejos %matemos no están definidas (I1y 12). if ll==O, refra=300e-3; refra=refrafl; refra=ceil(refra); vent=5/T; vent=ceil(vent); los 5 primerossegundosde la señal vent=sen(1:vent);%Setoman todas lasmuestras de estetramo offset=min(vent);%seelevanalcuadrado vent=vent+abs(offset); %y se buscan los picos que sobrepasen la media de de este tramo. vent=vent."2; %todas las muestras umbral=2*(mean(vent)); [p,l]=pkpicker(vent,umbral) Indice=l; while (I(indice)-l(l))<=refra %Se buscan los 2 posibles primeros complejos matemos indice=indice+l; %de acuerdo un periodo a refractario de 300ms. end pp=p(indice:length(p)); Il=l(indice:length(l)); P=[P(l);PPl; l=[l(l);ll]; end tamano=length(sen);%Secalculaelnúmerode vent=5/T; %un tramo señal dede vent=ceil(vent); tramo=vent: mestras para 5 seg. %Se buscantodos los picos en la señal [picj, locj]=pkpicker(sen); %Se calculala media de los picos picproml=mean(picj); [picj, locj]=pkpicker(s~~n,picproml);%Se buscantodos los picos en la señal %que estenpor arriba de la media de picjl %todos =picj; los pil:os de la señal. locjl =locj; 79 APENDICF 0etpicam.m (continuación) picprom2=mean(picj:1; %Se calcula nuevamentemedia la de los picos que se encontraron [picj, locj]=pkpicker(aen,picprom2); %Se buscan los picos que estén por arriba de esta media. picprom3=mean(picjj; %Se calcula nuevamente el promedio de los picos. [picj, locj]=pkpicker(s.en,picprom3);%Y se buscan los picos que están por arriba de este promedio. desvpic2=std(picj); umbral=picprom2-(2"desvpic2); %El umbral se define comoelsegundo promedio queseobtuvo %menos 2 vecesla desviación estándar de los picos que %se encontraron con el tercerpromedio %%Si es la primera vez que se invoca a la función, %%se presentan en la ventana, la gráfica y los controles %%"Quitar un pico" y "Agregar un pico" if I1==o ejes=axes( . . . 'Units','normalized', ... 'box','on',... 'drawmode','fast',. . . 'Position',[O.lO0.18 0.8 0.751); desp=uicontrol(gcf,'style','slider', ,... 'units','nomialized',. . . 'position',[O.lO0.93 0.8 0.031,... 'min', 1,'ma:c',tamano-tramo,'value', 1,... 'callback',[... 'global sen tramo,',.. , 'pos=get(gco,"Value");', ... 'axis([round(pos)round(pos)+tramo min(sen) max(sen)]);']); %Para quitar o agregar un pico se invoca a la funciórl 'quipopic.m' popibot=uicontrol(gcf, .. . 'BackgroundColor',[OO O], ... 'Style','pushbutton','Pos',[300 20 100 201,. . . 'ForegroundColor',[l 1 I], ,., 'String','Agregar un pico', 'visible','on'.... 'callback','global se desp continua locs picos popibot quipibot grafpic,quipopic(1,I)'); quipibot=uicontrol(gcf, .,, 'BackgroundColor',[O O O], , , , 'Style','pushbutton','Pos',[200 20 100 201, ... 'ForegroundColor',[ 1 1 I], . . . 'String','Quitar un pico', 'visible','on',... 'callback','global se desp continua locs picos popibot iquipibot grafpic,quipopic(1,2)'); end ini=l; hold on ¡¡=I; [picj, locj]=pkpicker(sen,umbral); %Se buscan los pico:; por arriba del %umbral definido anteriormente. 80 AF'ENDICE Detpicam.m (continuación) if 11-=o l(l)=ll: 1(2)=12: end I=find(locj>l(2))%Segeneran 2 vectores quetienenlasposicionesde los picos dos umbrales de detección distintos. Il=find(locj1>1(2)) %utilizando j=find(locj==l(l)) k=find(locj==1(2)) locj=[1(1);1(2);locj(I(l):(length(locj)))]; picj=[picj(j);picj(k);pic~,(l(?):(length(picj)))~; locjl=[1(1);1(2);locjl(ll(l):(length(locjl)))]; picjl=[picj(j);picj(k);picjl(Il(l):(length(picjl)))]; [picj, locj]=rrprom(pic~,locj,picjl,locjl,T,sen); %Se invoca a la función 'rrprom.m' 1'de 3búsqueda los complejos. %para picos=picj; locs=locj; if se==l sen=-1*sen; picj=-l*picj; picos=-l*picos; end if I1==o plot(sen); end %Gldfica de la señal hold on grafpic=plot(locs,picos,'*r'); %Se grafican los picos que se encontraron hold on set(gca,'xlim',[ini¡¡"tramo]); set(gca,'ylim',[min(sen) max(sen)]); ini=ii*tramo; if ll==O robt=uicontrol(gcf, , . , %Control "Enconrar Picos'' 'BackgroundColor',[O O O], ... 'Style','pushbutton','Pos',[lOO 20 100 201, . . . 'ForegroundColor',(l 2 I], ... 'String','Encontrarpicos', 'visible','on',... 'callback',[.. 'global grafpic se Iocs,',... 'delete(gcN3);',. . . 'set(grafpic,"visible","off");~,,,, 'detpicam(se,locs(I),locs(2));'1);%Se i n m a nuevamente la función'detpicam.m' definen se ahora %peroend las posiciones de los %2 primeros complejos maternos. 81 APEI,IDICE Elefrel .m %ELEFREI global frec % Definición de la variable global "frec" menl=uicontrol(gcf,':~tyle','text','position',[30 60 200 201. 'string','Frecuencia de Muestreo.'); editcol=uicontrol(gcf,'style','edit', ... edición decampo % Definición del 8020],.. frecuencia O h "editcol" de lapara 'positic8n',[30 30 'BackgroundColor','w','foregroundColor','k, ..% muestreo de la señal 'string','2'); % Definición del menú popcol=uicontrol(gcf,'Style','popup', ... 'String','Hz.lkHz.lMHz.lGHz.',.. uicontrol('string','Abrir.','position',[300 3080 401, ... 'callback','close(gco);leart,'); "teart". rutina la "popcol" para la % selección del rango de la % frecuencia de muestreo Oh 'Position',[l2030 50 60],'BackgroundColor','w','foregro~ndColor','k'); % Definicióndeelbotón"Abrii' a llama % que Elefre2.m %ELEFRE2 global frec % Definición de variable la global "frec" menl=uicontrol(gcf,'~;tyle','text','position',[30 60 200 20'!, 'string','Frecuencia de Muestreo.'); edición decampo % Definición del O h "editcol" para la frecuencia de 'position',[30 30 80201,... 'Backgr.oundColor','w','foregroundColot','k', ...% muestreo dela señal 'string','2'); editcol=uicontrol(gcf,':;tyle','edit'..., % Definición del menú % "popcol" para la 'Position',[l20 30 50 60],'BackgroundColor','w','foregrot~ndColor','k');% selección del rangode la % frecuencia de muestreo popcol=uicontrol(gcf,':3tyle','popup', ... 'String','Hz.IkHz.JMH;!.IGHz.',,.. uicontrol('string','Abrir.','position',[30030 80 401, ... 'callback','delete(gco);learb'); Oh Definicióndeel botón "Abrii' a llama % que la rutina "learb" 82 APEi'lDICE Enc0n.m function encon(ecgin'i,a,se,p,l); %FUNCIóN QUE LCICALIZA LOS COMPLEJOS FETALES EN LA SEÑAL global fetsen lvi T Ipf ecgder frec, length(se) %Si la onda R del ccmplejo fetal %es negativa, se invierten la señal %de ECGa y la señal resultante de la integración if se==l fetsen=fetsen*(-I); ecgder=ecgder*(-I:I; end t=T; refra=IOOe-3; refra=refra/t; refra=ceil(refra); lorf(l)=l(l) lorf(2)=1(2) %Se buscan los 2 primeros complejos en la señal %resultante de la integración. %Oh%%%%%%%%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Oh%% Ipsi(l)=l(l) lpsi(2)=1(2) lpsil =Ips¡(l)+lvi Ipsi2=lpsi(2)+lvi [m,psil]=max(ecgint~Ipsi(l):lpsil)) [rn,psi2]=max(ecgint(Ipsi(2):lpsi2)) Ipsi(l)=lpsi(l)+psil-I Ipsi(2)=lpsi(2)+psi2-1 tral=ecgint(lpsi(l):lpsi(l)+(2*a)) [b,c]=pkpicker(tral) b=b' c=c' [b,cc]=max(b) c=c(cc) Ipii(l)=c+(lpsi(l)-1) tra2=ecgint(lpsi(2):lpsi(2)+(2*a)); [b,c]=pkpicker(tra2); b=b; c=c" [b,cc]=max(b); c=c(cc); Ipii(2)=c+(lpsi(2)-1); o ~ o / o o / o o ~ o ~ o ~ o / o o / o o ~ oo ~ om ~oo /om Oo m o ohoho ho h o h o h o omo ko m ,oooooooooooooooooooooooooooooooooooooooo hhk///////////////// /// 83 APENDICE Enc0n.m (continuación) %Se buscantodos los picos en los primeros %1.5 segundos en la señal resultante de la integración %%%%o~%%%%%?~o~%%oh%%%%o~%%%%%%%%%%%%%%o~o~%oh%%%%oh%%%%%oh%%oh%%%%%%% vent=1.5/T; vent=ceil(vent); vent=ecgint(l:vent); [p,l]=pkpicker(vent,O), p‘p“ 1=1’. %~~o%%%%%%%%K%%%%~%%%%%%%%%%K%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Se consideran com’o señales deruido, %todos los picos que norepresentan %a los complejos fetales. %%%%%%%%%%%%%%%%%K%%%%%%%%%~~%%%%%%%%%%%%%%%%~%%%%%%%%Qh b=find(l==lpii(l)); c=find(l==lpii(2)); j=1; for i=l:length(l) if i-=b & i-=c if i<=c lrui(j)=l(i); j=j+l; end end end spki=ecgint(lpii(l)); spki=(0.125*ecgint(lpii(2)))+(0.87!7spki); if -isempty(ltui), npki=ecgint(lrui(1)); for i=2:length(lrui), npki=(0.125*ecgint(lrui(i)))+(0.875”npki); end, else npki(1)=0; end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %Se definen los umbrales de detección, %y los límites temporales de búsqueda. %%%%%%%%%%%%%%%%%%%%%%%%%%%~o~,%~o%~o~o~o~o%~o%~o~o%%~o%%%%%~%~~~~ umbil=npki+(0.25”(spki-npki)); umbi2=0.5”urnbil; rrprol =lpii(2)-lpii(l); rrprol l=rrprol; rrpro2=rrprol; rtpr022=rrpr02; rrll=0.95*npro2; rrll=floor(rdl); rrhl=1.1O*npr02; rrhl=ceil(rrhl); rrllm=0,85*rrpro2: rrllm=floor(rrllm); rrhlm=l.2*rrpro2: rrhlm=ceil(rrhlm); %%~h%%%%%%%%~~K%%%%%%%%%%%%%%~%~%%%%%%%%%%%%%%%%%%~~%%%%% 84 APENDICE Enc0n.m (continuacion) posi(l)=l; posi(2)=2; posil=[]; Ipos=[]; j=2; cont=l; contcon=l; contdes=O; k=l; kk=O; ultloc=lpii(j); %Se buscan los primeros 8 complejos fetales %para inicializar los limites temporales. for i=2:8, [pic,loc]=pkpicker(s~cgint(ultloc~l:ultloc+~l~),O) %Se realiza la búsqueda utilizando %límites temporales y el mayor loc=loc+(ultloc+rrll-1) %de 2 umbrales de búsqueda. Ipos=loc'; pos=pic'; Ipom=find(pos>=umbil); if -isempty(lpom), [md,lmd]=max(pos(lpom(l,:))) Ipos=lpos(1:Ipom(lmd)); Sisi se encuentra algún pico, se actualizan rrprol=[rrprol (loc(length(lpos))-ultloc)]; rrprol 1=mean(rrprol); %lospromedios de los periodos RR. npr02=[npr02 (loc(length(lpos))-ultloc)]; rrpro22=mean(rrpro2); cont=cont+l; contcon=contcon+l; contdes=O; posicion=loc(length(Ipos)); ultloc=loc(length(lpos)); else, [pic,loc]=pkpickel-(ecgint(ultloc+nllm:ultloc+nt7lm),0)%Si no se encuentra ningún pico, loc=loc+(ultloc+rrilm-I) %se incrementan los límites de búsqueda Ipos=loc'; pos=pic'; Ipom=find(pos>=umbil); if -isempty(lpom:l, [md,lmd]=max(pos(lpom(l,:))) Ipos=lpos(l:IpcNm(lmd)); nprol=[rrprol (loc(length(lpos))-ultloc)]; %Si se encuentra algún pico, se actualizan rrprol 1=mean(nprol); %los promedios de los periodos RR. npr02=[rrpr02 (loc(length(lpos))-ultloc)]; rrpro22=mean(rrpro2); posicion=loc(length(Ipos)); ultloc=loc(lengíh(lpos)); 85 APENDICE Enc0n.m (continuación) el se Ipom=find(pos:>=umbi2); %Si no se encuentra ningún pico, se utiliza un umbral menor para la búsqueda %Si no se encuentra ningún pico, se utiliza un umbral de valor O. if isempty(lporn), Ipom=l:lengíh(pos); Ipom=lpom'; end [m,j]=max(pos(lpom(:))); Ipos=lpos(1:Ipom(j)); nprol=[rrprol (loc(length(lpos))-ultloc)]; %Se actualizan los promedios de los rrprol l=mean(rrprol); '%periodos RR. rrpro2=[npro2 (loc(length(lpos))-ultloc)]; rrpro22=mean(rrpro2); kk=l; posicion=loc(length(lpos)); ultloc=loc(length(lpos)); end contcon=O: contdes=contdes+l; end. if length(lpos)>l, for m=l:length(lpos)-I, npki=(O.125*pic(m))+(0.875*npki); end end %Se actualiza el nivel de ruido de la señal. %Se actualiza el nivel de la señal (ECGf) if kk==O, spki=(0.125*ecgint(ultloc))+(0.875"spki); else spki=(0.25*ecginf.(uItloc))+(0.75*spki); end %Se actualizan los umbrales de detección y los límites temporales. umbil=npki+(0.25*(spki-npki)); umbi2=0.Yumbi1; Ipii(i+l)=ultloc; rrll=0.95*rrpro22; rrhl=l.lO*npro22; rrllm=0,85*rrpro22; rrllm=floor(rrllm); rrhlm= 1.2*rrpro22; rrll=floor(rTll); rrhl=ceil(rrhl); rrhlm=ceil(rrhlm); Ipos=[]; kk=O; end, 86 APENDICE Enc0n.m (continuación) i=length(lpii); puo=ultloc; %Se buscan los siguientes complejos fetales while (posicion+rrhlm) < length(ecgint), [pic,loc]=pkpicker(ecgint(puo+rrll:puo+rrhl),O); %Se realiza la búsqueda utilizando loc=loc+(puo+rrl-I); mayor %límites temporales el y Ipos=loc'; %de búsqueda. 2 umbrales de pos=pic'; Ipom=find(pos>=urnbil); if -isempty(lpom), [md,lmd)=max(pos(lpom(l,:))); Ipos=lpos(1:Ipom(lmd)); rrprol=[rrprol(2:13) (loc(length(Ipos))-puo)]; %)Sise encuentra algún pico,se actualizan rrproll =mean(rrprol); %lospromedios de los periodos RR. if cont < 8, rrpr02=[rrpr02 (loc(length(lpos))-puo)]; npro22=mean(rrpro2); cont=cont+l; else rrpro2=[npro2(2:8) (loc(length(lpos))-puo)]; rrpro22=mean('rrpro2); end, contcon=contcon+l; contdes=O; posicion=loc(length(Ipos)); else, [pic,loc]=pkpicker(ecgint(puo+rrllm:puo+rrhlm),O); loc=loc+(puo+nilm-l); lpos=Ioc'; pos=pic'; Ipom=find(pos>=umbil); %Si encuentra se no ningún pico, %se incrementan los limites de búsqueda. if -isempty(lpom), [md,lmd]=max(~~os(lpom(l,:))); Ipos=lpos(1:Ipom(lmd)); %Si se encuentra algún pico, se actualizan rrprol=[rrprol(;!:8) (loc(length(lpos))-puo)]; %los promedios de los periodos RR. rrprol 1=mean(rrprol); posicion=loc(length(lpos)); else Ipom=find(pos>=umbi2); %Si no se encuentra ningún pico, se utiliza un umbral menor para labúsqueda if isempty(lpom), %Si no se encuentra ningún pico, se utiliza un umbral de valor O. lpom=I :length(pos); Ipom=lpom'; end [m,j]=max(pos(lpom(:))); Ipos=lpos(l :Iporncj)); nprol=[rrprol(2:8) (loc(length(1pos))-puo)]; %Se actualizan los promedios de los rprol l=mean(rrprol); %periodos RR. kk= 1; posicion=loc(length(Ipos)); end APENDICE Enc0n.m (continuación) contcon=O; contdes=contdes+l; if contdes >= 8, rrpro2=rrprol; rrpro22=rrprol ,l; contdes=O; end, end, puo=posicion; if length(lpos)>l, for m=l:length(lpos)-I, npki=(0.125*pic(m))+(0.875*npki); end end %Se actualiza el nivel de ruido de la señal, %Se actualiza el nivel dela señal (ECGf) if kk==O, spki=(0.125*ecgint(puo))+(0.875*spki); else spki=(0.25*ecgint(puo))+(0.75*spki)~ end %Se actualizanlos umbrales de detección y los limites temporales, umbil=npki+(O.25*(spki-npki)); umbi2=0.5*umbiI; ¡=¡+I; Ipii(i)=puo; nll=0.95*rrpro22; rrhl=l. lPrrpr022; rrllm=0,85*npro22; rrllm=floor(nllm); rrhlm=l.2*rrpro22; rrll=floor(rrll); rrhl=ceil(rrhl); rrhlm=ceil(rrhlm); Ipos=[]; kk=O; end, 88 Enc0n.m (continuación) %A partir de la posicion de los complejos en la señal %resultante de la integración se buscan los complejos %en la señal de ECGa utilizando la pendiente de la señal. %%%%%%%%%%'~%%%%%%%%%%%%%%%%~%%%%%%%%%%%%%~%%%%%%~%~%%%Oh%%% for i=l:length(lpii), Im=lpii(i)-(2*lvi); lM=lpii(i); IMM=lpii(i)+(lvi); Im=round(lm); IM=round(lM); IMM=round(lMM); Ip=ecgder(lm:IM); Ipp=fetsen(lrn:IM); [mlp,lmlp]=pkpicker(Ipp); mlp=mlp'; Imlp=lmlp'; Imlp=lmlp+(lrn-I); [xx,yyI=max(lpp); yy=yy+(lm-1); %Se busca la máxima pendiente ~m~,lmpl=max(lp); Imp=round(lmp); Imp=lmp+(lm-I); uno=ecgder(lrnp); dos=ecgder(lmp+l); prod=uno*dos; %A partir de la máxiTa pendiente while sign(prod)>=O, Imp=lmp+l; %se busca el punto de pendiente cero R. uno=ecgder(lmp); %que representa el puntoonda de la dos=ecgder(lmp.-I); prod=uno*dos; end if -isempty(find(lmlp==Imp)) Ipf(j)=lmp; elseif -isempty(find(lmlp==(lmp+l))) Ipf(j)=lmp+l; else Imlpl=lmlp-Imp; Imlpl=abs(lmlpl:); [Imlp2,lmlp3]=mirl(lmlpl); Ipf(j)=lmlp(lmlp3); end if j>=2, ultpen=mp if Ipf(j)==lpf(j-I) Ipf(j)=lmp; end else ultpen=mp; end j=j+l end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O~%%% 89 APENDICE Enc0n.m (continuación) plpf=fetsen(lpf(l,:)); if se==l, fetsen=fetsen*(-I); plpf=plpf*(-I); ecgder=ecgder*(-I): end hold on tama=length(fetsen): trai=round(:!.Yfrec); desp=uicontrol(gcf,'style','slider', ... %Control desplazamiento del de 'units','norrnalized 'position',[O. 1O 0.93 0.8 0.031,.. , 'min', ,'max',tamano-tramoi,'value', 1 1,.., 'callback',[... 'global fetsen tramo¡,', ... 'pos=getl:gco,"Value");',... 'axis([round(pos) round(pos)+tramoi min(fet:sen) max(fetsen)]);']); la señal ' , . . . %Se presenta la gráfica de la señal. ini=l; ¡¡=I; set(gca,'nextplot','8-eplace'); plot(fetsen,'b'); hold on grafpic=plot(lpf,plpf,'*r'); hold on set(gca,'xlim',[ini ¡¡*tramo¡]); set(gca.'ylim',[mincfetsen) max(fetsen)]); set(gca,'color',[l 1 l],'xcolor',[O O O],'ycolor',[O O O]); hold on xlabel('muestras','color','k'); ylabel('magnitud,'c:olor','k'); hold on . . . . . . . . . . . . . . . . . . . . . . . . cuadbot=uicontrol('vi:;ible','on','position',[450 8080 201,... %Control "CTG" 'string','CTG',... 'callback'.['global lpf,',... 'delete(gco);',... 'ctg(lpf);']); %Se invoca a la función 'ctg.m' 90 Err0res.m function errores(cadena) %DESPLIEGA DIAL.OG0 DE ERROR. figura=figure( . , , 'color',[0.8 0.8 0.8], , . , 'Name','Error.', ... 'NurnberTitle','off', . . . 'MenuBar','Nore', ... 'UserData',[O], ... 'position',[268 264 263 721); info=uicontrol(... 'style','text',,.. 'backgroundcolor',[O.8 0.8 0.81, 'foregroundcoIor'J0 O O], ... 'Position',[G40 250 201, . . , 'UserData',[l], ... 'String',cadena); boton=uicontrol(, .. 'Position',[lOl 12 60 201, 'UserData',[I], ... 'String','OK'); t=waitforbuttonpress; d=get(gco,'UserData'); while t==l I d==O t=waitfo~uttonpre.ss; d=get(gco,'UserData'); end, if d==l close(figura); end 91 APENDICE Extrakm function [ol,Y1,L1,L:2,MD1]=extralv(xmin,muI,lonfet) %FUNCIóN QUE ELIMINA POR SUSTRACCIóN LOS COMPLEJOS MATERNOS %DE LA SEÑAL DE ECGa. %la función devuelve en '01' la señal de ECGa sin cornplejos maternos. global M contpat patpos msdes limm, msdes=[]; patpos=Il; contpat=O; muI=muI'; ultlib=[]; p l =find(xmin>limm('.) & xmin<limm(2)) %Se buscan los complejos p2=find(xmin>limm(3)& xmin<limm(4)) %a partir de los cuales se p3=find(xmin>limm(5) & xmin<limm(6)) %construyó el patrón. pl=pl(l); P2=P2(1); p3=p3(1); p4=[xmin(pl) xmin(p2) xmin(p3)l; %%%%%%%%%%Q~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o/ó O/ó%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . w=length(M( 1,:)); %%%%%%%%%%%% lonmatrw-(Ylonfet); Ito=lonfet+lonmat; %%O/ó%%%%%%%%% [s,d]=max(abs(M(w-lonfet+2,:))); LIl=d-l; L22=w-d; for ii=l : 3 %Cada uno de los 3 complejos tl=mul(p4(ii)-LI 1:p4(ii)+L22); %se alinea con el patrón materno cor=xcorr(tl,M(w-lonfet+2,:)); %de acuerdo a la onda R de este. [f,g]=max(cor); se %y calcula el punto de máxima %correlación mues 1=w-g; %Se alinean cada uno de los 3 tl=mul((p4(ii)-LI l)+muesl:(p4(ii)+L22)+muesl); al=m1n(min(corrcc~ef((M(w-lonfet+2,lonfet:lto)),tl(lonfet:lto)))); %complejos con el patrón h l l=(p4(ii)-LI l)+muesl; acuerdo %de a la máxima correlación, h22=(p4(ii)+L22)+muesl; se %y obtienen los coeficientes de restal=(mul(hl I:h22))-M(~-lonfet+2,:); %de correlación cruzada zll=std(restal(l:lonfet)); z22=std(restal(lonfet:lonfet+lonmat)): z33=std(restal(lonfet+lonmat:length(restal))); desl =zl1 *z22*z33; %Se calcula la desviación estándar de la diferencia de ultlib=[ultlib desl]; %decada complejo con el patrón materno. end %%%%%%%%%%& ?%%%%%%%%%%%%%%%% % I%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%O~%%%%%%%% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 APENDIC~ Extra1v.m (continuación) if xmin<2000 save edgardo M mu1 end tic; w=length(xmin); ww=size(M); o1 =muI; %Se alinea cada uno de los picos encontrados %con el patrón materno para la substracción. for i=l:w %La función 'mayorlvf.m' alinea los complejos %y adapta el patrón materno a los cambios en la seiial. [yl,al,dl,des,loc,ll1,121,md,ul]=mayorlvf(xmin(i),mul,lonfet,ultlib); 0 l ( l l l ( ~ l ) ~ l 2 l ( ~ l ) ) ~ ~ ~ ~ ~ ( l l l ( ~ l ) ~ l 2 l ( ~ l ) ) - M (%Se ~ ~ lelimina ) , ~ ) ~el complejo rnatemo MDl(i)=(md); Yl(i)=yl; Ll(i)=lll(yl); L2(¡)=121(yl); ultlib=ul; end t=toc save restapadre 01 93 Feta1fi.m function fetalfi %PROCESO PARA SELECCIONAR EL PATRóN FETAL global sena1 lifet fetal global fetl fet2 fet3 bot1 bot2 bot3mensaje I1 fll=lifet(l); f12=lifet(2); f21 =lifet(3); f22=lifet(4); f31=life@); f32=lifet(6); %Posición inicial y final %de cada uno de los c9mplejos seleccionados, %Se calcula la mitad de cada uno de los complejos. centl=fix((fl l+fl2)L!); fetl=senal(flI:f12); cent3=fix((f31+f32)./;!); fet3=senal(f31:f32); Il=length(fetl); 12=length(fet2); 13=length(fet3); If=[ll 12 131; [I,lmax]=max(lf); %De acuerdo al complejo más largo se calculan nuevainente los limites if Imax==:l mitad=centl-fll; f21=cent2-mitad; f22=cent2+mitad; f31=cent3-mitad; f32=cent3+mitad; fl2=centl+mitad; elseif lmax==2 mitad=cent2-f21; f l l=centl-mitad; fl2=centl+mitad; f31=cent3-mitad; f32=cent3+mitad; f22=cent2+mitad: APENDICE Feta1fi.m (continuación) else mitad=cent3-f31; fll=centl-mitad; fl2=centl+mitad; f21=cent2-mitad; f22=cent2+mitad; f32=cent3+mitad; end fetl=senal(fll:fl2); fet2=senal(f21:f22); fet3=senal(f31:f32); Il=length(fetl); 12=length(fet2); 13=length(fet3); If=[ll 12 131; %SE CALCULAN NUEVAMENTE LOS LíMITES ALINEANDOLOS DE ACUERDO A LAS MAXIMA CORRELACIóN limfo=[fl 1 ,f12,f21 ,f22,f31 ,f32]; limf=alinea(senal,limfo); %Se invoca la función 'a1inea.m' f l l=limf(l); f12=lirnf(2); f21 =limf(3); f22=limf(4); f31=limf(5); f32=limf(6); fetl =senal(f 1 1 :f 12); fet2=senal(f21 :f22); fet3=senal(f31 :f32); Il=length(fetl); y después de cada complejo. %Se agregan tramos de señal antes Il=round((ll*50)/100); fetl=senal(fll:fl2); feQ=senal(f21 :f22); fet3=senal(f31:f32); limf=[fll f12 f21 f22 f31 f32]; APÉNDICE Feta1fi.m (continuaciónj %Se presentala gráfica delos 3 complejos fetales seleccionados fig2=figure('Nurnberl-itle','off','Name','Patrón Fetal'); ejes=axes( . , . 'Units','normaliz'Etd',... 'Position',[O.ll 0.25 0.79 0.6951); plot(fet'l,'color',[.5 . 3 O]); hold on,plot(fet2,'r'); plot (fet3,'color',[.3 .8 O]); grid hold off de las tres señales %Se presentan los controles de selección para cada una botl=uicontrol(fig2, ,,, 'style','radio', ... 'BackgroundColor',[O.80.8 0.8],.., 'ForegroundColor',[.5 .3 O]. . . . 'string','señal l', .. . 'position',[280 60 '100 201, ... 'callback',[. . . 'global fetl bot2 bot&', ... 'set(bot2,"value4'.0);'... 'set(bot3."value",O);',... 'fetal=fetl;']); bot2=uicontrol(fig2, . . , 'style','radio', , , . 'BackgroundColor',[0.80.8 0.81,. 'ForegroundColor','r',, .. 'string','señal 2', . . 'position',[280 40 '100 201, . . . 'callback',[.,. 'global fet2botl bot3,',. , . 'setjbot1,"value' ,O);',,, 'set(bot3,"value",O)~', .. 'fetal=fet2;']); bot3=uicontrol(fig2, .. 'style','radio',. , , 'BackgroundColor',[O.8 0.8 0.81, 'ForegroundColor',[.3 .8O], , , . 'string','señal 3 , . . . 'position',[280 20 "'O0 201, ... 'callback',[.. 'global fet3botl bot2,',... 'set(botl,"value",O);'... 'set(bot2,"value",O);',... 'fetal=fet3;']); APENDICE Feta1fi.m (continuación) mensaje=uicontrol(gcf, ... %Mensaje: 'Seleccione una de las setíales' 'BackgroundCol~or',[0.80.8 0.81,. . , 'Style','text','Pos',[30 60 200 201,... 'ForegroundColor',[O O O], ... 'String','SelecciOne unade las señales.', 'visible','on'); %%Función del control "Continuar"%% cod=[... 'global bot1bot2 bct3 mensaje fetal I1 ,', 'set(gco,"callback","close(gcf);");',... 'set(bot1,"visible","off");', ... 'set(bot2,"visible","off');', . . . 'set(bot3,"visible","off");',.. 'set(mensaje,"visible","off");',... 'centra(ll,2);']; continua=uicontrol(gcf, ... %Control: "Continuar" 'BackgroundColor',[OO O], ... 'Style','pushbutton','Pos',[400 20 100 201,... 'ForegroundColor',[ 1 1 I ] , . . . 'String','Continuar', 'visible','on',... 'callback',cod); 97 APENDICE Guard1 .m function [senal, tamano]=guardl(bandera} %FUNCIóN PARA LEER UNA SEÑAL DE ECGa Y PqESENTARLA EN PANTALLA %La variable bandera especifica el tipode archivo que se abrirá global original libbot M picos Iocs despli T %DefiniciOn de variables globales global ii in¡ tramoi senal frec limpbot echo off pato=path; [archivo,pato]=uigetl'ile('*.txt','archivo de entrada'}; %Se obtiene nombre el archivo. del %y acceso ruta de archivo=[pato archivo]; iden= fopen(archivo,'rt'); %Se genera un identificador para abrir el archivo path=pato; if bandera == 1 [senal,tamano]= fscanf(iden,'%g'); %Lectura de datos else [senal,tamano]= fread(iden,inf,'intl6'); end fclose(iden); set(gcf,'visible','off); onginal=senal; YOSeobtienenelnúmerodemuestrasparauntramode tramoi=tramoi/(frec*lO); tramoi=round(trarnoi); tramoi=tamano/tramoi; tramoi=round(tramoi); ini=l; cad=num2str(tamana);%Sepresentaenpantallael,&mero cad=rNúrnero de Muestras: ' cad]; uicontrol(gcf,'style','te!xt','position',[30 30 280 201,... 'ForegroundColor',[l 1 I], ... 'BackgroundColor',(0.50 0.50 OSO], , , , 'HorizontalAlignrnent','left',... 'string',cad); 10 seg de muestras uicontrol(gcf,'style','text','position',[30 50 280 201,... %Se presenta en pantalla 'ForegroundColor',['l 1 l],.., frecuencia %la de muestre0 'BackgroundColor',[~O.50 0.50 0.50], ... 'HorizontalAlignment','left', ... 'string',['Frecuenciade Muestreo: ' num2str(frec) 'Hz,']); ejes=axes( . . , 'Units','normalizetl',,. . 'color',[l 1 I] ,... 'box','on',, . . 'drawmode','fast',. . . 'xcolor',[O O O], , . . 'ycolor',[Oo O], ... 'Position',[O.10 0.48 0.8 0.451); 98 APENDICE Guard1.m (continuaeih) despii=üiconiroi(gci,'s~~le','siidei, ... %Se crea Ü U control para ,.. ?he!desp!azam en!^ de!ase%! '.nit.','n~.l?!ized', 'position',[D.lO0.93 0.8 G.03], . . . 'min',l,'max',tamano-tramoi,'value',l, ... 'callback',[ , . 'global senal tramoi,',. . . 'pos=get.(gco,"Value");',... 'axis([round(pos) round(pos)+tramoimin(sena1)max(senal)]);']); espera=uicontrol('string','Salir.','position',[450 20 80 261,... %Control "Salir" 'callback','clear all,closeall,'); uicontrol('position',[~l50 50 80 20],'string','Filtrar',... %Control "filtrar" %%%%%%%FUNCIÓN DEL CONTROL "FITRAR"%%%%%%% 'callback',[. . . 'global senal ii ¡ni tramoi original libbot limpbot frec,',... 'set(gco,"visible","off");',... 'set(libbot."visible","on");',.,. 'setjlimpbot,"visible","on");', ... 'x=zeros([l 10000]);',... 'x(5000)=1;'.... '[h,g,rh,rg]=wspl;ne(7,21);', ... %Análisisysíntesisde los filtroscorrespondientes %a un esquema biortogonal de soporte compacto 'm=multires(x,h,lh,g,rg,lO);', ... %Análisismultiresoluciónde 10 detalles. Oh Se eliminan los detalles de las primeras 'xx=sum(m(4:7,:));',... %últimas y 3 bandas. 'b=rx(4500:5500);',, , , 'save coefib,',... 'senal=prepro(original);', ... % Se invoca ala funcion 'prepr0.m' (filtado y normalización) 'tramin=ini-tramoi+I;',,,. 'pos=get(gca,"xllm");',.. 'set(gca,"nextplot","replace");',. , , 'plol:(senal,"b");',... %Se grafica la señal normalizada. filtrada y 'set(gca,"xlim",[pos(1) pos(2)]);',, . . 'set(gca,"ylim",[rnin(senal) max(senal)]);',... 'set(gca,"color",[l 1 I]."xcolor",[O 0 G],"ycolor",[O O G]);',.,. 'hold on,',... 'xlabel("muestra:~","color","k");',,,, 'ylabel("magnitud","color","k");',... 'hold on,',. . , 'ven2,'I);%Seinvocaalproceso'ven2.m' libbot=uicontrol('visible','off,'position',[45050 80 20],'string',... %Control "Librerías" 'Librerias',. . . 'callback',[... %%%,%%%%FUNCIóN DEL CONTROL "LIBRERIAS"%%%%%%% 'global materno fetal sena1 M,',.,, 'ifisempty(matern0) I isempty(fetal),',. . , '%Si no sehanseleccionado los patrones ' errores("Primero seleccionelos patrones.");',. . .%se presenta un mensaje de error. ' figure(gcf);',... 99 100 APENDICE Learb.m global senal frec T % Definición de variables globales cb-col= [ 1 1000 1000000 1000000000]; YO El vector"cb-col" contiene las magnitudesde mag= cb-col(get(popcol,'Value')); % Se obtiene en "mag" valor el de "cb-col" % correspondiente a la selección en "popcol" % rangos de frecuencia. frec=get(editcol,'strirlg'); % Se obtiene lafrecuencia que introduceelusuario frec=stC?num(frec); frec=frec*mag; T= 1Ifrec; Oh Se calcula la frecuencia % y periodo de muestreo set(popcol,'visible','off); O h Se elimina eltexto y controlesde la figura set(editcol,'visible','off); set(men1,'visible','of"'); (senal,tamano]=guard1(2); % Se invoca a la función "guardl" que devuelve un vector % con la señal a procesar,y el número de muestras de la señal Leart.m global senal frec T % Definición de variables globales cb_col= [ I 1000 1000000 1000000000]; % El vector"cb-col"contiene las magnitudesde % rangos de frecuencia. mag= cb-col(get(popco1,'Value')); % Se obtiene en "mag" el valor de "cb-col" % correspondiente a la selección en "popcol" frec=get(editcol,'string'); Oh Se obtiene la frecuenciaque introduce el usuario frec=stC?num(frec); frec=frec*mag; T= 1Ifrec; % Se calcula la frecuencia O h y periodo de muestreo set(popcol,'visible','off); % Se elimina el texto y corltroles de la figura set(editcol,'visible','off'); set(menl,'visible','off'); [senal,tamano]=guarcll(l); % Se invoca a la función "guardl" quedevuelve un vector % con la señal a /procesar,y el número de muestrasde la señal 101 APEINDICE Limpiar.m function limpiar %FUNCIóN DONDE SE ELIMINAN LOS COMPLEJOS MATERNOS DE LA SEÑAL DE ECGa global sena1 M fetal materno Iocs picos desp tramoi fetsen T Y1 limm frec, carnbio=O; condl =locs(1)-(length(fetal)+length(matemo)); cond2=locs(length(locs))+length(fetal)+length(maternc1); if condl<l I cond2 :' length(sena1) %Encaso de ser necesario, se agregan ceros de finalalamplia; principio %al y la señal %para la eliminacibn primer dely último complejo cambio=l ; T'). 'amplia. %(proceso end total=length(locs) [ol,Y1,L1,L2,MD1]~~extralv(locs,senal,length(fetal)); 96Se invoca a la función 'extra1v.m' %(eliminación delos complejos maternos). if cambio==l %Si se agregaron tramos inicial y fina a la señal, se eliminan. incre-(length(fetai)+length(matemo)); senal=senal((incrt?+l):length(senal)-incre); ol=ol((incre+l):length(ol)-incre); limm=limm-incre; end fetsen=ol: hold on %Se obtiene número el de muestras para tramo el tamano=length(fetsen);%de 2.5 seg que se presenta enla gráfica tramoi=2,Yfrec; trami=round(tramoi); desp=uicontroi(gcf,'style','slider', ... %Control parael despiazamiento dela señal 'units','norlnalized,... 'pos1tion',[O. 1O 0.93 0.8 0.03],. .. 'min',1,'m;lx',tamano-tramoi,'value', 1,.. . 'callback,[... 'global fetsen tramoi,',... 'pos=gel(gco,"Value");', ... 'axis([round(pos) round(pos)+tramoi min(fetsen) max(fetsen)]);']); ini=l; ¡¡=I; set(gca,'nextplot','replace'); plot(fetsen,'b'); %Se presenta gráfica de la los primeros set(gca,'xlim',[iniii*tramoi]);%2.5segde la señal sin complejos maternos. set(gca,'ylirn',[min(fetsen) max(fetsen)]); set(gca,'color',[l 'I I],'xcolor',[O O O],'ycolor',[OO Ojj; hold on xlabel('muestras','color','k'); ylabel('magnitud','color','k'); hold on 102 APENDICE Limpiar.m (continuación) %%%%%%%%%%%%%%%%%%%%%%% filbot=uicontrol('visible','on','position',[450 80 80 201,. . . %Control "Pasabanda" %(fltrado pasabanda) 'string','Fasabanda.',. . . %%%%%FUNClÓN DEL COIVTROL "PASABANDA%%%%% 'callback',['globalfetsen despfrec,',... 'delete(desp);',... 'delete(gco);',.. . 'pbanda(fetsen);']); %Se invoca a la función 'pbanda.m' 103 APENDICE function matfi %PROCESO PARA GENERAR EL PATRON MATERNO global lirnat sena1 matemo limm m1 l=limat(l); m12=limat(2); %de cada uno m21=limat(3); m22=limat(4); m31=limat(5); m32=limat(6); %Posición inicial y final de los complejos seleccionados. %Se calcula la mitad de cada uno de los complejos centl=fix((mll+ml2)./2); matl=senal(mIl:ml2); Il=length(matl); 12=length(mat2); 13=length(mat3); 1=[1112131; [I,lmax]=max(l); %De acuerdo ai complejomás largo se calculan nuevamente los límites if Imax==l mitad-centl-mll; m21=cent2-mitad; m22=cent2+mitad; m31=cent3-mitad; m32=cent3+mitad; ml2=centl+mitad; elseif Imax==2 mitad=cent2-m21: m1l=centl-mitad; ml2=centl+mitad; m31=cent3-mitad; m32=cent3+mitad; m22=cent2+mitad; else mitad=cent3-m31; m1l=centl-mitad; ml2=centl+mitad; m21=cent2-mitad; m22=cent2+mitad; m32=cent3+mitad; end 1O4 APENDICE Matfi.m (continuacion) matl=senal(mll:ml'2); mat2=senal(m21:m22); mat3=senal(m31:m32); Il=length(matl); 12=length(mat2); 13=length(mat3); 1=[11 12 131; %SE CALCULAN NIJEVAMENTE LOS LíMITES ALINEANDOLOS DE ACUERDO A LAS MÁXIMA CORRELACIóN limmo=[mll,ml2,m21,m22,m31,m32]; limm=alinea(senal,limmo); %Se invcca la funcion 'a1inea.m' mll=limm(l); m12=limm(2); m21=limm(3); m22=limm(4); m31=limm(5); m32=limm(6); matl=senal(mll:m12); mat2=senal(m21:mi!2); mat3=senal(m31:m32); %Se presenta la grhfica de los 3 complejos seleccionados. fig2=figure('NumberTitle','off','Name','Complejos Matemos'); grafl=subplot(2,1,1),plot(matl,'color',(.5 .3O]); hold on,plot(mat2,'r'); plot (mat3,'color',[.2,.8 O]); grid posgrfl =get(grafl,'pos'), set(grafl,'pos',[posgrf1(1)-.05 posgrf1(2)+.02 posgrfl(3)-.13 posgrfl(4)]), tex=['Complejos matemos']; gca title('Comp1ejosmatemos','color','k'); boton=uicontrol('string','Continuat, ,... 'Pos',[430 30 100 201,. . . 'callback','close(gcf)'); materno=matl+mat2+mat3; matemo=materno/3 %Control "Continuar" %Se cierra la ventana. OhSe obtiene el promedio de las 3 señales Il=length(matemo); %Se agregan tramos de señal antes y después de czda complejo Il=round((ll*5O)/100); 105 Matfi.m (continuación) matl=senal(mll:rnl:2); mat2=senal(m21:m22); mat3=senal(m31 :m32); limm=[rnll m12m21m22m31m321; matemo=matl+mat2+mat3; materno=matemo/3; centra(l1,l); %Se obtiene el promediode las 3 señales %Se inVOca a la función 'centra.m',para obtener los límites finales del patrón. 1O6 APENDICE Matfwav.m %PROGRAMA PRlhlCIPAL PARA ELIMINAR LA SEÑAL MATERNA %DE LA SEÑAL ABDOMINAL POR WAVELETS clf %$Limpia todas las variables. clear all O h Limpia todas las variables globales clear global echo off % Definición devariablesglobales global original senlinl xx lfin materno fetal M locs picos sena1 clear all clear global close(gcf) % Limpia todas las variables. % Limpia todas las variables globales O h la Sierra ventana actual pos=[O, 0.5, 0.5, 0.5:!; % Se define el vector "PO:$ figl =figure('NumberTitle','off','Name','Señal Abdominal',...%Se define la figura "figl" 'color',(0.80.8 0.81); encabezado. %y su uicontrol( . . . 'Style','frame', ... de 'Units','normalind', ... (.35-.05)+2*.02], ., . 'Position',[.O502 .05-.O2 (.75-.05)+2*.02 'BackgroundColor',[O,500.50 0.501); % Definición de un cuadro % para el texto y controles O h dentro la figura mensaje=uicontrol('style','text','position',[40 90 350 501,... % Definición del texto. 'string','Programapara eliminar la señal matema de la señal abdominal por wavelets.'): entrada-. uimenufgcl,'label','Abrir Archivo'); Oh Definición del menu "Abrir Archivo". entr=uimenu(entrada,'label','Archivo Texto','CallBack','defrel'); entrl =uimenu(entrada,'label','ArchivoBinario','CallBack','elefre2'); % Definición del submenú % "Archivo Texto". % Se llama a la rutina %"elefrel" Definición del submenu % "Archivo Binario". % Se llama a la rutina %elefre2 Oh 1o7 Mayor1vf.m function [y,a,dl,des,loc,11,12,mindes,ul]=mayorlvf(xmin,mul,lonfet,ultlib); global M contpat patpos msdes, w=length(M(l,:)); band=O; %%%%%%%%%%%% lonmat=w-(2*lonfet); Ito=lonfet+lonmat; %%%%%%%%%%%% [s,d]=max(abs(M(\rv-lonfet+2,:))); %Cadauno de los complejos LIl=d-1; con alinea %se el materno patrón R de este, L22=~-d; acuerdo %de onda a la %y se calcula el punto de máxima %correlación. los tl=mul(xmin-Ll I:)tmin+L22); dealinean uno %Se cada cor=xcorr(tl,M(w-lonfet+2,:)); patrón el%complejos con acuerdo [f,g]=max(cor); %de acorrelación, la máxima coeficientes %y selosobtienen de muesl =w-g; tl=mul((xmin-L1l)+muesl:(xmin+L22)+muesl);%decorrelacióncruzada al=min(min(corrcc~f((M(w-lonfet+2,lonfet:lto)),tl(lo~fet:lto)))); h l 1=(xmin-L1l)+muesl; h22=(xmin+L22)+1nuesl; restal=(mul(hlI:h22))-M(~-lonfet+2,:); z l l=std(restal(l:lonfet)); z22=std(restal(lonfet:lonfet+lonmat)); z33=std(restal(lonfet+lonmat:iength(resta1))); desl =zl I*z22'z3:3; %Se calcula la desviación estándar dediferencia la de %de cada complejo con el patrón materno. if -isempty(ultlib), mdes=mean(ultlib); sdes=std(ultlib); if desl<=(mdes+sdes), %Si se trata de un complejo no conflictivo, band=l ; %se almacena la desviación estándar contpat=contpat+l; msdes=[msdesdesl]; %delresultado de la diferencia %entre el patrón y el complejo materno patpos=[patpos h l 1 h221; end end, if band==O, . . . . . . . . . . . . . . . . . . . . . . . . y=l; a=al, dl=restal ; des=desl ; loc=w-lonfet+2; Il=hll; 12=h22: mindes=desl; ul=ultlib; . . . . . . . . . . . . . . . . . . . . . . . . . 108 APENDICE Mayor1vf.m (continuacion) else, y=l; a=al; dl=restal; des=desl; loc=w-lonfet+2; Il=hli; 12=h22; mindes=desl; ul=[ultlib desl]; end %Si se han encontrado 5 complejos no conflictivos %se seleccionan los 3 que presenten una menor %desviación estándar enla diferencia (resta) con el patrón %y con estos complejos se obtiene un nuevo patrón. if contpat==5, contpat=O; [f,g]=rnin(rnsdes); prirn=g.*2; msdes(g)=inf; [f,g]=min(rnsdes); segu=g.*2; rnsdes(g)=inf; [f,g]=rnin(msdes); terc=g.*2; patmatl=mul(patpos(prim-1):patposjprim)); patmat2=mul(patpos(segu-l):patpos(segu)); patmat3=rnul(patpos(ter~-l):patpos(terc)); cte2=5; nuevo=O:l:(cte2-1::; nuevo=nuevo./cte>!; 1,(Ionmat-IO))]; tra=[nuevo( 1) nuevo(2) nuevo(3) nuevo(4) nuevo(5) ones( tra=[tra nuevo@) nuevo(4) nuevo(3) nuevo(2)nuevo(l)]; norma=[zeros(1,lonfet) tra zeros(1Jonfet)]; patmatl =patmat1."norma; patmat2=patmat2."norma; patrnat3=patmat3."norma; prn=patmatl+patmat2+patmat3; pm=prn./3; M(~-lonfet+2,:)=pnl(I,:); patpos=[l; msdes=[]; end 1o9 function mwint(ori); %FUNCIóN QUE INTEGRA LA SEÑAL %CON UNA VENTANA DE INTEGRACIóN %DE 60ms. global ecgint trai despli fetl fet2 fet3 T Ivi a frec, %Se integra la señal. %%%%%%%%%%%%%%%%%%%%%%%%%%~~Q%% ventana450e-3; ventana=ventana/T; N=ceil(ventana); N=rnax([length(fetl) length(fet2) length(fet3)l) N=60e-3; N=round(N/T); a=N; b=ones(1,N); ecgint=filter(b,a,ori); %Se utiliza la función 'filter m ' Ivi=N; %para integrara la señal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tama=length(ecgint); trai=round(2,5*frec); despli=uicontrol(gcf,'styie','slider', ... %Control de desplazamiento de la señal, 'units','norrnalized',. . . 'position',[O 1O 0.93 0.8 0.031,.. , 'min', 1,'max',tama-trai,'value',l , .. . 'callback',[.., 'global ecgint trai,', . . . 'pos=get(llco,"Value");~, ,,, 'axis([round(pos) round(pos)+trai min(ecgint) max(ecgint)]);']); %Se presenta la gráfica de la señal. in¡=1; ¡¡=I; set(gca,'nextplot','replace'); plot(ecgint,'b); set(gca,'xlim',[ini ii*kai]); set(gca,'ylim',[min(ecgint) max(ecgint)]); set(gca,'color',[l 1 'l],'xcolor',[O O O],'ycolor',[O O O]); hold on xlabel('muestras','color','k'); ylabel('magnitud','color','k'); hold on 110 APENDICE Mwint.m (continuación) %%%%%%%%%~h%%%%%%%%%%%%% picobot=uicontrol('viaible','on','position',[450 80 80 201,.. %Control "Ondas R" 'string','Ondas R.',... 'callback',['globalecgint despli a,',,.. 'delete(gco);',. . . 'delete(despli);',. . . 'polpif(s:cgint,a);']); %Se invoca a la función 'po1pif.m'. . . . . . . . . . . . . . . . . . . . . . . . . 111 AF'EldDICE Patfet.m function patfet %PROCESO DE SErLECClÓN DE 3 COMPLEJOS FEiTALES SIN TRASLAPAMIENTO. global sena1 lifet i j in tramo f ff tam=length(senal); sena=senal; in=l; ¡=I; jZ-1. tramo=round(3*frec); %Se obtiene número el de muestras %para un tramo de 3seg. de señal figNumber=figure(... 'Name','Seleccióndel patron fetal.'. 'NumberTitle','off, ... 'Visible','off', ... 'UserData',[l], ... 'position',[120 100 560 4201); ,._ %Se abre una ventana %para la gráfica de la señal ejesl-axes( . . 'Units','normaliz:ed',... 'UserData',[ I], , , 'Position',[O.IO 0.20 0.800.701); , graf=plot(in:i*tramo,:senal(in:i*tramo)); set(graf,'UserData',[l]); set(ejes,'userdata',['l]); uicontrol( .. . 'Style','text', ,., 'Position',[50 40 150 201, ... 'BackgroundColor',[0.80.8 0.81, 'ForegroundColor',[O O O], ... 'HorizontalAlignment','left', , , , 'UserData',[l], ... 'String','iDesea ver mas señal?'); %Se presentala gráfica de %los ptimeros 3seg. dela señal %Se presenta la pregunta %'¿Desea ver mas señal?' botno=uicontrol('pos~ition',[50 20 60 20],'string',... % Sepresenta la opción 'No'. 'No','callback',[... 'global in i tramo lifet j f ff,',,,, J=]+2;',. .. ' ifj==7' > %Si se han seleccionado complejos 3 se cierra la ventana ' close(gcf);' , . . ' else,'.... %Si seleccionado han seno complejos 3 ' f=l;',.. invoca %se a la función 'segmentam' para ' ff=2;', ... %seleccionar complejo. un ' segmenta(in,i*tramo);',... ' end,']); I ' I I.'' 112 APENDICE Patfet.m (con,tinuación) botsi=uicontrol('position',[l20 20 60 20],'string',... %Se presenta la opción 'Si' 'Si','callback',[... 'global i in tramo senal,',... 'in=i*tramo;',... %Se presenta en la ventana la gráfica de '¡=¡+I;',. . . %los siguientes 3seg 'plot(in:i*tramo,!;enal(in:i*trarno));']); set(figNumber,'Visible'.'on'): 113 APENDICE Patmat.m function patmat %PROCESO DE SELECCIóN DE 3 COMPLEJOS MATERNOS SINTWSLAPAMIENTO. global sena1 h a t i :Iin tramo f ff frec tam=length(senal); sena=senal; in=l; ¡=I; jZ.1. trama=round(3*freq; %Se obtiene el númer:, de muestras %para un tramo de 3seg. de señal figNumber=figure( ... 'Name','Selecc:ión de lospatronesmatemos(3).', 'NumberTitle','off', ... 'Visible','off', ... 'UserData',[l], ... 'position',[ 120 1O0 560 4201); ... %Seabreunaventana %para la gráfica dela señal ejes=axes( . . . 'Units','normali;led', ... 'UserData',[Z], .. 'Position',[O.lO0.20 0.80 0.701); graf=plot(in:i*tramo,senal(in:i*tramo)); set(graf,'UserData',Il]); set(ejes,'userdata',[11); uicontrol( ... 'Style','text', ... 'Position',[5040 150 201, . . . 'BackgroundColor',[0.80.8 0.81, .. 'ForegroundColor',[O O O], .. . 'HorizontalAligl?ment','left',.. . 'UserData',(l], ... 'String','¿Desea vermas señal?'); %Se presentala gráfica de %losprimeros 3seg. dela señal %Se presenta la pregunta %'¿Desea ver mas señal?' botno=uicontrol('position',[50 2060 20],'string',.. % Se presenta la opción'No'. 'No','callback',[... 'global in i tramo limatj f ff,',... ' j=j+2;', . . , ' ifj==7 ,' %Si se hanseleccionado3complejossecierra la ventana ' close(gcf);',. , , ' else,',... %Sihan seleccionado se no complejos 3 f=l;',,.. %se invoca a la funciim 'segmenta.m' para ' ff=l;',... %seleccionar complejo. un ' segmenta(in,i*tramo);',.. 'end,']); , 1"' I 114 APFNnlCF Patmat.m (continuación) botsi=uicontrol('pos1tion',[l20 20 60 20],'string',. . . %Se presenta la opción 'Si', 'Si','callback',[... 'global i in tramo senal,',... 'in=i*tramo;',... %Se presenta en la ventana gráfica la de '¡=¡+I;',,,. %lossiguientes 3.939. 'plot(in:i*tramo,~~enal(in:i*tramo));']); set(figNumber,'Visitlle','on'); 115 A,PENDICE Pbanda.m global ecglim trai despli fetsen frec, %Coeficientes de 121ecuación de diferencias %del filtro pasa bajas a=[1 -2 I]; b=[l O O O O O -2O O O O O I]; ecglim=filter(b,a,ecgcon);%Filtrado de la señal ecgcon-ecglim; %Coeficientes de la ecuación de diferencias %del filtro pasa altas a=[1 I]; b~[-lOOOOOOOOOOOOOOO32OOOOOOOOOOOOOOOI]~ ecglim=filter(b,a,ecgcon); %Filtrado de la señal fetsen=ecglim; tama=length(ecglim); trai=round(2,5*frec); despli=uicontrol(gcf,'style','slider',,.. %Control de desplazamiento de la gráfica 'units','norrnalized',... 'position',[O. 1O 0.930.8 0.03],,. . 'min',l ,'max',tama-trai,'value',1,.. . 'callback',(... 'global ecglim trai,',... 'pos=get(gco,"Value");',. . . 'axis([round(pos)round(pos)+trai min(ecglir1) max(ecglim)]);']); %Se presenta la gráfica dela señal filtrda. ini=l; ¡¡=I; set(gca,'nextplot','replace'); plot(ecglim,'b'); set(gca,'xlim',[ini ¡¡'%ai]); set(gca,'ylim',[min(ecglim) max(ecglim)]); set(gca,'color',[l 1 l],'xcolor',[O O O],'ycolor',[OO O]); hold on xlabel('muestras','c:olor','k'); ylabel('magnitud','c:olor','k'); hold on 116 APENDICE Pbanda.m (continuación) %%%%%~%%%%%%%%%%%%%%~~oO~~~ deribot=uicontrol('visible','on','position',[450 80 80 201,. . . %Control "Derivar" 'string','Derivar.',... 'callback',['globalecglim despli,',... 'delete(despli);',. . , 'delete(gco);',... 'derivar(ecglim);']);%Seinvoca a lafunción'derivar.m' 117 APENDICE function pini(ecgint,a,senti); %FUNCIóN QUE E3USCA LOS POSIBLES COMPLEJOS FETALES %EN LOS PRIMEROS 3 SEGUNDOS DE LA SEÑAL. global fetsen IviT ecgder I p continua popibot quipibot grafpic se ejes a senti, se =senti; %Si la onda R del complejo fetal %es negativa, se invierten la señal %de ECGa y la señal resultante dela integración if se==l fetsen=fetsen*(-I); ecgder=ecgder*(-'I); end ecgder=ecgder(:); ecgder=ecgder'; ecgint=ecgint(:); ecgint=ecgint'; fetsen=fetsen(:); fetsen=fetsen'; t=T; refra=100e-3; refra=refra/t; refra=ceil(refra); %Se seleccionan los primeros 3 seg. de la señal vent=3/T; vent=ceil(vent); Ion3s=vent; vent=fetsen( :vent); 1 offset=min(vent); vent=vent+abs(offset); ~ent=vent.~2; %Se cuadrado eleva al todas las muestras %de los primeros3seg. deseñal, y se buscan umbral=3*(mean(vent)); (p,I]=pkpicker(vent,umbral)%los picos mayores a 3 vecesel valor medio p=p" %de todos sección esta puntos en de la señal l=l'; p=fetsen(l); if length(p)<=l %Si no se encuentran por lo menos 2 picos umbral=1.5*(mean1:vent)); %elumbraldedetecciclnsereduce a la mitad [p,l]=pkpicker(vent,umbral) p=p" (=I'. p=fetsen(l); end if se==l fetsen-fetsen*(-I); ecgder=ecgder*(-I); end Pini.m (continuación) %Se presenta una nueva ventana. picgr=figure('NumberTitle','off','Name','Selección del periodo inicial,'); ejes=axes( . . . 'Units','normalized', ... 'box','on',, , . 'drawmode','f~rst',.., 'Position',[O.lO0.2 0.80.751); %Se presenta la gráfica de los primeros 3 seg. de la señal graftmp=plot(fetsen(I:lon3s)); mensaje=uicontrol(gcf, ... %Se presenta un mensaje escrito en la ventana. 'BackgroundColor',[0.80.8 0.81,... 'Style','text','Pos',[30 40 350 201,... 'ForegroundColor',[OO O], ... 'String','Seleccione la localización de los dos primeros patrones.', 'visible','on'); %%Función del control "Continuar"%% cod=[.. . 'global picgr se senti p I a ecgint mensaje graftmp ejes continua,',... 'close(gcf);',, . . 'encon(ecgint,a,senti,p,I);']; %Se invoca a la función 'enc0n.m' %búsqueda de los complejos en la señal resultante de la integración continua=uicorltrol(gcf, ... %Control "Continuar". 'BackgroundColor',[O O O], , . . 'Style','pushbutton','Pos',[400 20 100 20],.. 'ForegroundCc4or',[I1 I ] , ... 'String','Continuar', 'visible','on',... 'callback',cod); %Se presenta el control de la función "Agregar un 3ico" % %donde se invoca a la función 'qppfm' % popibot=uicontrol(gcf, ... 'BackgroundColor',[OO O], ... 'Style','pushbutton','Pos',[300 20 100 201, ... 'ForegroundColor',[l 1 I], ... 'String','Agregar un pico', 'visible','on',. . . 'callback','global se senti a continua I p popibot quipibot grafpic,qppf(1,1)'); %Se presenta el control de la función "Quitar un pico" % %donde se invoca a la función 'qppfm' % quipibot=uicont?ol(gcf,, , , 'BackgroundColor',[O O O], . . . 'Style','pushbutíon','Pos',[200 20 100 201,... 'ForegroundColor',[l 1 I ] , .,. 'String','Quitar un pico', 'visible','on',... 'callback','global se senti a continua I p popibot quipibot grafpic,qppf(1,2)'); if senti==l p=-I*p; end hold on grafpic=plot(l,p,'*r'); %Se presentan en la gráfica los picos encontrados %en los primeros 3 segundos de señal. 119 AF'ENDICE Po1picam.m function polpicam %PROCESO PARA SELECCIONAR LA POLARIDA[) %DEL COMPLEJO MATERNO EN LA SEÑAL global h a t lifet se posbot negbotpicgr mensaje sena1 materno ejes graftmp continua filabsj=senal; length(fi1absj) picgr=figure('NumberTitle','off,'Name','Deteccióonde Picos.'); %Se presenta una nueva ventana ejes=axes( . . . 'Units','normali;red', ... 'Posit¡on',[G.l30.25 0.79 0.6951); graftmp=plot(matemo); %Gráfica patrón del materno mensaje=uicontrol(gcf, ,. . %Se presenta un mensaje escrito 'BackgroundColor',[O.80.8 0.8]s... 'Style','text','Pos',[130 60 250 201,... 'ForegroundColor',[O O O], ... 'String','Laonda R del complejo materno es...', 'vlsible','on'); posbot=uicontrol(gcf, . . . %Botón que define la polaridad positiva del complejo 'style','radio',. . . 'BackgroundColor',[0.80.8 0.81,... 'ForegroundColor',[OO O], . . . 'string','Positiva',. , . 'position',[l50 40 100201, . . . 'callback,[... 'global filabsj se posbot negbot,',. . . 'set(negbot,"value">O);'.., 'se=O;']); negbot=uicontrol(gcf, ... %Botónquedefinelapolaridadnegativadelcomplejo 'style','radio',. .. 'BackgroundColor',(O.80.8 0.81,.. . 'ForegroundColor'.[O O O]. . . . 'string','Negativa',. . . 'position',[l50 20 'I00 201, . . . 'callback',[.. . 'global filabsj se negbot posbot,',. . . 'set(posbot,"valLle"~O);' ... 'se=1;'I); %%Función del conlrol "Continuar"%% cod=[.. . 'global picgrse posbot negbot mensaje graftmp ejescontinua.', .. 'if get(posbot,"value")==O& get(negbot,"value")==G,',. ' errores("Se1eccione una opción.");',. . . ' figure(picgr);',... 120 APENDICE Po1picam.m (continuación) 'else,',. . . 'set(gco,"callback","close(gcf);");', ... 'set(ejes,"visible","off");',.., 'set(graftmp,"visible","off");',.. 'set(posbot,"visible","off");', ... 'set(negbot,"visible","off");',... 'set(mensaje,"visible","off");', . . . 'detpicam(se,O,O);',... %Se invoca la función 'detpicam.m' 'end,']; continua=uicontrol(gcf, . . . %Control"Continuar" 'BackgroundColor',[OO O],, , , 'Style','pushbutton','Pos',(400 20 100 201,... 'ForegroundColor',[l 1 I ] , ... 'String','Continuar', 'visible','on',... 'callback',cod): 121 Po1pif.m function polpif(ecgint,a) %FUNCIóN DONDE EL USUARIO SELECCIONA %LA POLARIDAD DE LA ONDA R DEL COMPLEJO %QRS FETAL global h a t lifet ecgint a se posbot negbot picgr mensaje sena1 fetal ejes graftmp continua filabsj=senal; length(fi1absj) picgr=figure('NumberTitle','off','Name','Señal Fetal'); %Se presenta unanueva ventana. ejes=axes( , , . 'Unlts','normalized, ... 'Position',[O.l3 0.25 0.79 0.6951); graftnlp=plot(fetal); %Se presenta la gráfica del patron fetal %Se presenta un mensaje escrito. mensaje=uicontrol(gcf, . . . 'BackgroundColor',[O.80.8 0.81,... 'Style','text','Pos', [ 130 60 250 20],, .. 'ForegroundColor',[O O O ] , .. , 'String','La onda R d e l complejo fetal es...', 'visible','on'); %Se presenta el boton que define como %positiva a la onda R del complejo fetal posbot=uicontrol(gcf, .,. 'style','radio', ... 'BackgroundColor',[0.8 0.8 0.81,.. , 'ForegroundColor',[O O O],, , , 'string','Positiva', .., 'position',[l50 40 100 201, ... 'callback',[.. . 'global filabsj se posbot negbot,',., , 'set(negbot,"value",0);'... 'se=O:']); %Se presenta el botljn que define como %negativa a la onda R del complejo fetal negbot=uicontrol(gcf,... 'style','radio', ... 'BackgroundColor',[O.8 0.80.81,... 'ForegroundColor',/OO O], ... 'string','Negativa', ,. . 'position',[l50 20 IO0 201, ... 'callback',[. . . 'global filabsj se Inegbot posbot,',... 'set(posbot,"value",O);'. ,. 'se= 1;'I); 122 APENDICE Po1pif.m (continuación) %%Función del control "Continuar"%% cod=[... 'global picgr se posbot ecgint a negbot mensaje graftmp ejes continua,',,. ... 'if get(posbot,"valve")==O & get(negbot,"value")==O~' ' errores("Se1eccione una opción ' figure(picgr);',... 'else,',. . . 'close(gcf);',. . , 'pini(ecgint,a,se);',... %Se invoca a la función 'pinim' 'end,']; .'I);',... continua=uicontrol(gcf, ... %Control "Continuar" 'BackgroundColor',[OO O], ... 'Style','pushbutton','Pos',[400 20 100 201, ... 'ForegroundColor',[l 1 I ] , ... 'String','Continuar', 'visible','on',... 'callback',cod); Prepr0.m function y=prepro(x); %PREPROCESAMIENTO %CON FILTRO PASABANDA EQUIVALENTE %REGRESA SEÑAI- FILTRADA Y NORMALIZADA y=x./max(abs(x)); % Se normaliza la señal. load coefi y=filter(b,1,y); % Se filtraseñal. la 123 Qppf.m function qppf(vez,bandera); %ESTA FUNCIóN QUITA Y PONE PICOS SEGúN SE INDIQUE POR EL USUARIO global se senti band continua I p popibot quipibot a ai3 b fetal fetsen grafpic eccgint gca; if vez==l grid on band=bandera; set(popibot,'visible','off'); set(quipibot,'visible','off'); Oh Se define nuevalnentela función del control "Continua" set(continua,'callback',('global popibot quipibot ecginta se senti p I,', ... 'grid off,',... 'set(popibot,"visible","on");' , . . . 'set(quipibot,"visible","on");',,... 'set(gco,"callback","global a ecgint se senti p l,close(gcf),',... 'encon(ecgint,a,senti,p,l);");']); aa=[]; b=[l; %%Se define la furtción del puntero al desplazarse por la ventana %% %%de forma tal que presionar al el botón de ratón, %% %%se ejecute de nuevo la función 'Qppfm' %% set(gcf,'units','norrn,3lized','WindowButtonMotionFcn',[ .,. 'global aab I p band,',. . . 'aa=get(gcf,"currentpoint");', ... 'b=get(gca,"cu~entoint");', ... ' if aa(l)>O.lO & aa(1)<0,9 & aa(2p0.18 & aa(2)<0.93,',. . . ' set(gcf,"pointer","crosshair");', ... ' set(gcf,"WindowButtonDownFcn","global a aa b bsnd I p,if band==l,qppf(2,l);else,qppf(2,2);end,");', ' else,',... ' set(gcf,"pointer","arrow");', .. ' set(gcf,"Windo~rButtonDownFcn","");',. . . 'end,']): elseif vez==2 set(gcf,'pointer','arrow'); set(gcf,'WindowButtonMotionFcn',"); set(gcf,'WindowButlonDownFcn',"); %%Se agraga el pico más cercano al punto donde se colocó el cursor %% if bandera==l lon=length(fetal)./:?; lon=round(lon); locp=round(b(1)); yi=fetsen(locp); 124 APENDICE Qppf.m (continuación) inilocp=locp-Ion: finlocp=locp+lon; rango=fetsen(inilocp:finlocp); if senti==l rango=-l*rango; end [maximo,i]=max(~-ango); locp=inilocp+i-I; yi=fetsen(locp); I=[I locp]; I=sort(l); donde=find(l==locp); rangol=p(l:donde-I); rango2=p(donde:length(p)); p=[rangol y¡]; p=[p rango21; hold on set(grafpic,'visible','off); hold on grafpic=plot(l,p,'*r'); %%Se elimina el pico mas cercano al punto donde S'? colocó el cursor %% elseif bandera==2 x=b( 1); y=b(3): resta=abs(l-x); lug=find(resta==rnin(resta)); locq=l(lug); sublocl=l:lug-I; subloc2=lug+l:length(l); I=l([sublocl subloc2]); p=p([sublocl subloc2]); hold on set(grafpic,'visible','off'); hold on grafpic=plot(l,p,'*r'); end end 125 Quipopic.m function quipopic(vez,bandera); %ESTA FUNCIóN QUITA Y PONE PICOS SEGúN SE INDIQUE POR EL USUARIO global se band desp continua locs picos popibot quipibot a b materno sena1 grafpic gca; if vez==l grid on band=bandera; set(desp,'visible','off); set(popibot,'visible','off); set(quipibot,'visibls','off'); set(continua,'callback',['global desp popibot quipibot,',... %Se define nuevamente la función 'grid off,', ... %del control "Continua" 'set(desp,"visible","on");', ... 'set(popibot,"visible","on");',. , 'set(quipibot,"visible","on");', .. , 'set(gco,"callback","close(gcf);");~])~ , %%Se define la función del puntero al desplazarse por la ventana %% %%de tal forma que al presionar el botón de ratón, %% %%se ejecute de rluevo la función 'quipopic.m' %% set(gcf,'units','nomlalized','WindowButtonMotionFcn'~[ ... 'global a b locs picos band,',, , , 'a=get(gcf,"currentpoint");',... 'b=get(gca,"currentpoint");', ... ' if a(1)>0.10 & a(1)<0.9 & a(2p0.18 & a(2)<0.93,',... ' set(gcf,"pointer","crosshair");', .. ' set(gcf,"WindowButtonDownFcn","global a b ban3 locs picos,if band==l ,quipopic(2,1);',... else,quipopic(2,2);end,");' ,... else,', ... ' set(gcf,"pointer","arrow");', ... ' set(gcf,"Windo\rvButtonDownFcn","");', .. . 'end,']); I elseif vez==2 set(gcf,'pointer','arrow'); set(gcf,'WindowButtonMotionFcn',"); set(gcf,'WindowButtonDownFcn',"); 126 APENDICt Quipopicm (continuación) %%Se agrega el picomás cercano al punto dondeSI! colocó el cursor %% if bandera==l lon=length(rnaterno)./2; lon=round(lon); locp=round(b(I)); yi=senal(locp); inilocp=Iocp-Ion: finlocp=locp+lon; if finlocp>length(senaI); finlocp=length(senaI); end rango=senal(inilocp:finlocp); if se==l rango=-I*rango; end [rnaximo,i]=rnax(rango); locp=inilocp+i-I; yi=senal(locp); locs=[locs;locp]; locs=sort(locs); donde=find(locs==locp); rangol=picos(l:donde-I); rango2=picos(dor~de:Iength(picos)); picos=[rangol;yi] picos=[picos; rango21; hold on set(grafpic,'visible','off); grafpic=plot(locs,picos,'*r'); %%Se elimina el pico más cercano al punto donde se colocó el cursor %% elseif bandera==2 x=b(l); y=b(3); resta=abs(locs-x); lug=find(resta==min(resta)); locq=locs(lug); sublocl=l:lug-I; subloc2=lug+l:ler1gth(locs); locs=locs([subloc'l subloc2],:); picos=picos([sublocl subloc2],:); hold on set(grafpic,'visible','off'); grafpic=plot(locs,picos,'*r'); end end 127 APENUICE Rrpr0m.m function [pics,Iocs]=~rom(pic,loc,pic1 ,locl,t,senal) %%FUNCIóN QUE BUSCA LOS COMPLEJOS MATERNOS EN LA SEÑAL DE ECGa %% refra=300e-3; refra=refra/t; refra=ceil(refra); tap=length(pic); pics(l)=pic(l); pics(2)=pic(2); %Se inicializan los límites temporales de acuerdo a %el periodo entre el primer y segundo complejo. ave1 ave2=[]: avel(l)=loc(2)-loc(l); ave2(1)=avel(l); avell=avel(l); ave22=avelI; rrll=0.85”avel( 1); rrhl=1.25^avel(l); rrll=floor(rrll); rrhl=ceil(rrhl); rrllm=refra rrhlm=1.7*avel(l); rrhlm=ceil(rrhlm) =[I; posi(l)=l; posi(2)=2; posil=[]; loc2=[]; km=l; Ipos=[]; j=2; cont= 1; contcon=l; contdes=O; k=l; kk=O; ultloc=loc(j) 128 Rrpr0m.m (continuación) %Se buscanlos prirneros 8 complejos matemos %para inicializarlos límites temporales, for i=2:8, if (ultloc+rrhlm)<length(senal) Ipos=find(loc>(ultloc+nll)& loc<(ultloc+rrhl)) %Se realiza búsqueda la utilizando temporales. %limites if -isempty(lpos), [m,j]=max(pic(lpos(:))) j=lpos(j) avel=[avel (loc(j)-ultloc)]; %Si se enwentra algún pico, se actualizan %los promedios de los periodos RR. avel l=mean(avel); ave2=[ave2 (loc(j)-ultloc)]; ave22=mean(ave2); cont=cont+l; contcon=contcolI+l; contdes=O; posicion=loc(j); ultloc=loc(j) else, Ipos=find(loc>(ultloc+nllm) & loc<(ultloc+rhlm)) %Si encuentra se no ningún pico, %se incrementanlos limites de búsqueda. if -isempty(lpos), [m,j]=max(pic(lpos(:))) j=lpos(j) %Si se encuentra algún pico, se actualizan avel=[avel (lm(j)-ultloc)]; %losproredios de los periodos RR. avel l=mean(avel); ave2=[ave2 (loc(j)-ultloc)]; ave22=mean(ave2); posicion=loc(j); ultloc=loc(j) else Ipos=find(locl>(ultloc+nllrn) & locl<(ultloc+rrhlm))) %Si no se encuentra ningún pico, if -isempty(lpos) %se utiliza un umbral menor parala búsqueda [m,j]=max(p!cl(Ipos(:))) j=lpos(j) %!3encuentra se algún pico, se actualizan avel=[avel (locl(j)-ultloc)]; %los promedios de los periodos RR. avel 1=mean(avel); ave2=[ave2 (loco)-ultloc)]; ave22=mean(ave2); posil (k)=j; k=k+l; kk=l; posicion=Iocl (j); ultloc=locl(j) else [m,j]=max(senal(ultloc+nlltn:ultloc+rrhlm)) encuentra se%Si no ningún pico, amplitud mayor de pico alconsidera j=j+ultloc+nllm-I %se R. onda avel=[avel la %como (j-ultloc)]; avel l=mean(avel); los periodos RR loc2(km)=j; promedio aclualiza %Se de el km=km+l; kk=l; posicion=j: ultloc=j end 129 APENDICE Rrpr0m.m (continuación) end contcon=O; contdes=contdes+l; end, if kk==O, posi(length(posi)+l)=j end rrll=0.85*ave22; rrhl=1.25*ave22; rrhlm=l.7*ave22; rrll=floor(rrll); rrhl=ceil(rrhl); rrhlm=ceil(rrhlm); %Se actualizan lo:; limites temporales Ipos=[]; kk=O; end end, i=length(posi); puo=ultioc; %Se buscan los siguientes complejos en la señal while (posicion+rrhlnl) < length(senal), Ipos=find(loc>(puo+rrll)& loc<(puo+rrhl)); %Se realiza la búsqueda utilizando if -isempty(lpos), %límites temporales. [m,j]=max(pic(lpos(:))); j=lpos(j); %Si se encuentra algún pico, se actualizan avel=(avel(2:8) (loc(j)-puo)]; %los promedios de los periodos RR. avell=mean(ave?); if cont < 8, ave2=[ave2 (lotc(j)-puo)]; ave22=mean(ave2); cont=cont+l; else ave2=[ave2(2:8) (loco)-puo)]; ave22=mean(ave2); end, contcon=contcon+l; contdes=O; posicion=loc(j); else, Ipos=find(loc>(puo+nllm)& locc(puo+rrhlm)); %Si no se encuentra ningún pico, %se incrementan los límites de búsqueda. if -isempty(lpos) [m,j]=max(pic(lpos(:))); j=lpos(i); %Si se encuentra algún pico, se actualizan avel=(avel(2:8) (loco)-puo)]; ave1 l=mean(avel); %los promedios de los periodos RR. posicion=loc(j); 130 Rrpr0m.m (continuación) else Ipos=find(locl>(puo+nilm) & locl <(puo+rrhlm)); %Si no se encuentra ningún pico, if -isempty(lpos) %se utiliza un umbral menor parala búsqueda [m,j]=max(p~cl(Ipos(:))); j=lpos(j); %Si se encuentra algún pico, se actualizan avel=[avel(2:8) (locl(j)-puo)]; %lospromedios de los periodos RR. avel 1=mean(avel); pos¡1(k)=j; k=k+l; kk=l; posicion=Iocl(j); else [m,j]=max(~~nal(puo+rrllm:puo+rrhlm)); %Si noencuentra se ningún pico, j=j+puo+rrllm-I; considera al %se mayor pico de amplitud R. avel=[avel(:2:8) (j-puo)]; %como onda la avel l=mean(avel); loc2(km)=j; %Se actualiza el promedio de los periodos RR km=km+l; kk=2; posicion=j; end end contcon=O; contdes=contdes+l ; i f contdes >= 8, %Si se encuentran 8 intervalos que estén ave2=avel; %fuera de los límites iniciales de búsqueda, ave22=avell; %se substituyen lcls promedios. contdes=O; end, end, if kk==O, posi(i+l)=j; puo=loc(posi(i+l)); ¡=¡+I; elseif kk==l p~~=l~~l(pOSil(k-.l)); elseif kk==2 puo=j; end rrll=0.85*ave22; %Se actualizan los limites temporales rrhl=l.25*ave22; rrhIm=1.7*ave22; rrll=floor(rrll); rrhl=ceil(rrhl); rrhlm=ceil(rrhlm); Ipos=[]; kk=O; end, posi; P~~~=~~~~~posi(:));locl(posil(:));loc2(:)]; posi=sort(posi); pics=senal(posi(:)); locs=posi; 131 Segmenta.m function segmenta(inped,finped) %FUNCIóN QUE DELIMITA LA ZONA DE UN COMPLEJO. %La función recibecomo parámetros de entrada elini1:io y el final de un segmento de la señal. global tam cox¡ coxf b ti tf sena1 pos global a b p cox¡ co li limat lifet j f ff figura=figure('Narne','Selección de complejo.', . , . 'NumberTitle','off,... 'position',[ 120 1O0 560 4201); %Sepresentaunanuevaventana ejes=axes( . . . 'Units','normalized, ... 'Position',[O.130.15 0.775 0.8251): p=o; co=[]; a=[]; b=I1; cox¡=[]; coxf=[]; inicial=O; final=O; sobre l a ventana, define %%Se la función del puntero al moverse %%Cuando el punter(:, está sobrela gráfica, se puede almacenarla posición al presionar elbotón &I set(figura,'units','nomlalized','WindowButtonMotionFcn',[ ... 'global a b p cox¡ coxf co li h a t lifet pos,',... 'a=get(gcf,"currentpoint");', ... 'b=get(gca,"currentpoint");',. ,. 'if p==l,',... ' set(co,"xdata",[coxib(1) b(1) coxi]);',,,, ' set(co,"EraseMode","xor"); hold on,',. . , ' set(pos,"String",nurn2str(round(b(l))));',.,. 'else,',... ' if a(lp0.13 & a(l)<0.905 & a(2p0.11 & a(2)<0.925,',... ' set(gcf,"pointer","crosshair");',,. ' li=get(gca,"ylim");',... ' li=li*O.999;',. . . ' set(gcf,"WindowButtonDownFcn","global co,set(co," 'visible"",""off"");',.,, coxi=b(l);p=l;co=fill([b(l) b(1) b(1) b(l)],[li(l) li(1) li(2) li(2)],[0.50 O]);");',,,, ' set(gcf,"WindowButtonUpFcn","p=O;co~=b(l);");',,., ' set(pos,"String",numZstr(round(b(l))));',.,, ' else,',, . , ' set(gcf,"pointer","arrow");', ... ' set(gcf,"WindowBLttonDownFcn","");',,.. ' set(gcf," WindowButtonUpFcn","");',... ' set(pos,"String",'"');',, . . ' end,',... 'end,']); %% ratón ohoh 132 Segmenta.m (:continuación) %Se presenta la gr2Aca del tramo de la señal x=inped:finped; graf=plot(x,senal(inped:finped)); hold on grid tamtoda=length(senaI(inped:finped)); tam=inped:finped; inicial=O; final=O; x=[]; Y=[]; n=O; lin=[]; estado=[]; but=l; %Se presentan los objetos que indican laposición del Juntero. uicontrol(gcf,'HorizontalAlignment','right', ,.. 'BackgroundColor',[0.80.8 0.81,... 'Style','text','Pos',[30 20 50 201,... 'ForegroundColor',[O O O], , , , 'String','Muestra:', 'visible','on'); pos=uicontrol(gcf,'HorizontalAlignment','left', 'BackgroundColor',[O.80.8 0.81,... 'Style','text','Pos',[80 20 70 201,... 'ForegroundColor',[O O O], ... 'String', '0 'visible','on'); %Control "Contindar" boton=uicontrol(gcf, ... 'BackgroundColor',[O O O], ... 'Style','pushbutton','Pos',[350 20 100 201,... 'ForegroundColor',[ 1 1 I], .., 'String','Continuar', 'visible'.'on', ... ' global tam limat lifet cox¡ coxf f ff j,',,,. 'if ff==l,', ... ' limat(j)=round(coxi);',,,, ' limat(i+l)=roundlcoxf):',,.. , ,, 'elseif ff==2,', ... ' lifet(j)=round(coxi);',... ' lifet(j+l)=round(coxf);',,, 'end,',... I %Límites de un complejo materno, I %Limites de un complejo fetal 133 Segmenta.m (continuación) 'if f==2,',... ' close(gcf);f=l;',... 'else,',... %Si se ha seleccionado complejo un %se cierra la ventana. ' hold off,',... ' close(gcf);',. , %Si se selsccionado ha tramo un ' f=2;',... invoca nuevamente %se ' if ff==l,',... %para seleccionar complejo. el ' segmenta(limat(j),limat(j+l));',,.. ' elseif ff==2,',... ' segmenta(lifet(j),lifet(j+l));', , end,',. , , 'end,']); de la señal la función 'segmenta.m' ,, I 134 4PENDICE T0das.m %PROCESO QUE PRESENTA LOS PATRONES DE TRASLAPAMIENTO %Y EL CONTROL PARA LA BúSQUEDA DE LOS COMPLEJOS MATERNOS EN LA SEÑAL global sena1 vari=size(M); libgr=figure('NumberTitle','off','Name','as'); ejes=axes( . , , 'Units','nomalized',... 'Positioni,[0.130.25 0.79 0.6951); PWM(I,:M; %Sepresenta la gráficadel Ohprimer patrón traslapamianto de %Se presenta el menú "Selecciónde picos" para la búsqueda de los complejos matemos en la señal. menupic=uimenu(gcl','label','Selección de picos','callback','polpicam'); %Se invoca al proceso 'po1picam.m' uicontrol('string','Gra'ficar', ... %Control "Graficar" 'Callback',[... 'global M van,',... %Se presentan en ur'a secuencia 'for i=l:van(l),',... %todos los patrones de traslapamiento ' plot((M(i,:)));',,.. ' drawnow, 'end,']); I,. ., uicontrol('string','Cerrar','position',[lOO20 60 201,... %Control "Cerrar" 'Callback','close(gcf),'); % S cierra ~ ~ la ventana 135 Ven2.m %PROCESO PARA COLOCAR NUEVOS MENUS EN LA BARRA DE HERRAMIENTAS DE LA FIGURA global sena1 limat lifet materno fetal frec m=get(gcf,'children':l; %Búsqueda limat=[]; liiet=ij; lon=length(m); for k= 1 :Ion; tipos=get(m(k), 'type'); s='uimenu'; es=strcmp(tipos,s); if es==l; delete(m(k)); end end de todo los objetos de la figura %Se eliminan los menús actuales dela figura datos='Userdata'; ret=uimenu('Label','Iniciar','CallBack','clear all,close all,matfwav');%Menú para reiniciar el proceso completo pat=uirnenu('Label','Patrones'); %Menú generar para los patrones %MenD d e l patón materno. patl =uimenu(pat,'label','Materno'); pat2=uimenu(pat,'label','Fetal'); %Menú del patrón fetal. patl 1=uimenu(patl ,'label','Selección','callback,, , %Opción "Selección" del menú materno. invoca 'patmat;'); %Se al proceso 'patmatm'. , ... %Olxión "Promedio" del menú materno. patl2=uimenu(patl ,'label','Promedio','callback', 'matfi;'); invoca %Se al prweso 'matfi.m'. pat21=uimenu(pat2,'label','Selección','callback', ... %OIxión "Selección" del menú fetal. 'patfet;'); invoca %Se al prcceso 'patfet.m'. pat22=uirnenu(pat2,'label','Mejor señal','callback',... %Opción "Mejor Señal" delmenú fetal 'fetalfi;'); 'feta1fi.m'. procesoal invoca %Se fp=gcf; 136