Ecg en Matlab

May 6, 2017 | Author: Omar Fernando Granados Vergara | Category: N/A
Share Embed Donate


Short Description

Download Ecg en Matlab...

Description

INGENIERÍA BIOMÉDICA

“DESARROLLO DE UNA INTERFACE GRÁFICA PARA UN ELECTROCARDIÓGRAFO PORTÁTIL”

ALUMNA: MARÍA EUGENIA CALVA ROJAS ASESOR: DONACIANO JIMÉNEZ VÁZQUEZ

_________________________ Asesor Donaciano Jiménez Vázquez

Julio de 2008

________________________ Alumna María Eugenia Calva Rojas

ÍNDICE

Introducción…………………………………………………………. 1 Antecedentes………………………………………………………… 2 Creando una GUI en Matlab………………………………… 3 Propiedades de los controles………………………………… 3 Tipos de Objetos…………………………………………….. 4 Editor de Menús……………………………………………... 5 Objetivo……………………………………………………………… 6 Descripción de la inteface………………………………………….... 6 Interface Gráfica (ECG Portátil)……………………………….......... 8 Resultados…………………………………………………………... 21 Comentarios……………………………………………………….... 27 Conclusiones………………………………………………………... 28 Anexo A…..……………………………………………………….... 29 Bibliografía…………………………………………………………. 38

2

INTRODUCCIÓN La herramienta Matlab nos proporciona la posibilidad de aprovechar todo su potencial operativo pero con gráficos orientados al usuario. Sin duda esto presenta una ventaja para usuarios que no tienen experiencia en trabajar con Matlab debido a la sencillez de la interface gráfica. Por parte del programador, todas las funciones se pueden implementar en dichos entornos. Las variables o valores se pueden asignar a funciones a través de botones, barras de desplazamiento, checkbox, etc. Y los resultados se pueden mostrar en un cuadro de textos, en una lista de valores o incluso en una gráfica enmarcada de la propia interface. El propósito de este proyecto consiste en desarrollar una interface gráfica para un electrocardiógrafo portátil*. El cual cuenta con las siguientes características: 1. Adquisición de la señal. Mediante una terminal de 3 electrodos conectados al paciente y a la placa mediante un cable trenzado. 2. Etapa de amplificación analógica. Una de las partes más destacadas, puesto que la señal que recibe es muy débil y debe ser amplificada, evitando el ruido. 3. Funcionamiento del microcontrolador PIC18F452. Se ha elaborado un programa escrito en ensamblador para hacer la conversión analógica-digital de la señal del ECG y configurado la USART del PIC para enviar los datos a la PC. 4. Interfaz de comunicación entre el PC y la placa. Se utilizo el protocolo de comunicación RS-232. Dentro de las características indispensables de la interface se encuentran las siguientes:  Fácil manejo.  Contar con las instrucciones adecuadas en tiempo de ejecución.  Amigable para el usuario final. Con esto aseguraremos un manejo óptimo y adecuado del software.

3

ANTECEDENTES MATLAB es un lenguaje de alto desempeño diseñado para realizar cálculos técnicos. MATLAB integra el cálculo, la visualización y la programación en un ambiente fácil de utilizar donde los problemas y las soluciones se expresan en una notación matemática. MATLAB es un sistema interactivo cuyo elemento básico de datos es el arreglo que no requiere de dimensionamiento previo. Esto permite resolver muchos problemas computacionales, específicamente aquellos que involucren vectores y matrices, en un tiempo mucho menor al requerido para escribir un programa en un lenguaje escalar no interactivo tal como C o Fortran. MATLAB se utiliza ampliamente en:      

Cálculos numéricos Desarrollo de algoritmos Modelado, simulación y prueba de prototipos Análisis de datos, exploración y visualización Graficación de datos con fines científicos o de ingeniería. Desarrollo de aplicaciones que requieran de una interfaz gráfica de usuario (GUI, Graphical User Interface).

En el ámbito académico y de investigación, es la herramienta estándar para los cursos introductorios y avanzados de matemáticas, ingeniería e investigación. En la industria MATLAB es la herramienta usada para el análisis, investigación y desarrollo de nuevos productos tecnológicos. La ventaja principal de MATLAB es el uso de familias de comandos de áreas específicas llamadas toolboxes. Lo más importante para los usuarios de MATLAB es que los toolboxes le permiten aprender y aplicar la teoría. Los toolboxes son grupos de comandos de MATLAB (archivos M) que extienden el ambiente de MATLAB para resolver problemas de áreas específicas de la ciencia e ingeniería. Por ejemplo, existen toolboxes para las áreas de Procesamiento Digital de Señales, Sistemas de Control, Redes Neuronales, Lógica Difusa, Wavelets, etc. Acerca de GUIDE Las interfaces gráficas de usuario (GUI-Graphical User Interface en Inglés), es la forma en que el usuario interactúa con el programa o el sistema operativo de una computadora. Una GUI contiene diferentes elementos gráficos tales como botones, campos de texto, menús, gráficos, etc. Existen diferentes lenguajes de programación que permiten crear una GUI tales como: C, Visual Basic, TK, etc., solo por mencionar algunos. Todos ellos permiten usar diferentes controles y maneras de programarlos, Matlab nos permite realizar GUI’s de una manera sencilla usando GUIDE (Graphical User Interface Development Enviroment).

4

Creando una GUI en Matlab Una de las tantas herramientas con las que cuenta Matlab, es la creación de GUI’s. La forma de implementar las GUI con Matlab es crear los objetos y definir las acciones que cada uno va a realizar. Al usar GUIDE obtendremos dos archivos:  Un archivo *.FIG: Contiene la descripción de los componentes que contiene la interfase.  Un archivo *.M: Contiene las funciones y los controles del GUI así como el callback. Un callback se define como la acción que llevará a cabo un objeto de la GUI cuando el usuario lo active. Para ejemplificarlo, suponga que en una ventana existe un botón el cual al presionarlo ejecutará una serie de acciones, a eso se le conoce como la función del callback. Iniciando GUIDE Para crear una GUI en Matlab tecleemos guide en la ventana de comandos de Matlab. Seleccionaremos la opción Default GUI. Figura 1

Figura 1.

En la pantalla se aparecerá la un área de diseño similar a la de la Figura 2.

5

Figura 2.

En la parte superior se encuentran los menús y opciones de GUIDE, en la parte izquierda se aprecian los diferentes controles y en la parte central el área de diseño donde pondremos los controles a usar. Propiedades de los controles: Las propiedades varían dependiendo del control a usar, a continuación se explican las más comunes (Figura 3): Background Color: Cambia el color del fondo del control. Callback: La propiedad más importante del control, ya que le dice al control que hacer cuando este se active. Enable: Activa o desactiva un control String: En el caso de botones, cajas de texto, texto estático; es el texto que muestra el control. Tag: Otra de las propiedades más importantes ya que con este es posible regresar datos o identificar al control.

Figura 3.

6

Tipos de Objetos:

   

Activar Adquisición Procesar ECG Identificar complejos QRS Desplegar FFT Para seleccionar que ventana de gráfico quiero limpiar; la de ECG o FFT. Para desplegar el valor calculado de VFC Para visualizar todas las muestras del registro en la ventana. Para enmarcar los objetos con funciones relacionadas. Para colocar el nombre de la ventana de adquisición.

Editor de Menús Nuevo Submenú Nombre que aparece en la interface

Nuevo menú

Nombre que se maneja en el código de programación

7

 Objetivo: Este proyecto es la continuación de la tesis “Electrocardiógrafo Portátil*”. El objetivo es el desarrollo de una interface gráfica en Matlab para este electrocardiógrafo portátil, la cual debe ser confiable, clara y amigable para el usuario:  Descripción de la Interface Invocación de la portada de presentación del ECG

Inicia la inteface del ECG portátil

Nueva adquisición

Inicialización del objeto (puerto) para la adquisición

Definición de características: -Tipo de puerto -Nombre del puerto -Modo de adquisición -Tamaño del buffer de entrada

*

(Cargar/Guardar) Adquisición

Definición del menú de opciones (Cargar/Guardar)

Definición de los tipos de archivos que se pueden cargar (Load) y Guardar (Save). Tipo de extensiones y direcciones donde se leerán los archivos en el Load y donde se almacenarán en el Save.

Procesar adquisición

Definición de los objetos para el procesamiento

Se emplearán botones para activar las funciones, ejes para desplegar gráficos y cuadros de texto estático para desplegar valores obtenidos del procesamiento.

Jiménez Santiago Gonzalo, Mejía González Jaime. Electrocardiógrafo Portátil. Tesis Lic. Ing. Biomédica UAM-I 2007

8

 Adquirir un nuevo registro o El usuario elegirá el tiempo de adquisición con un tiempo límite de 10 minutos. o Procesar el nuevo registro  Cargar un archivo de datos (Registro de ECG) con extensión *.dat. o Desplegar la gráfica en pantalla o Procesar la señal como si hubiera sido recién adquirida  Guardar archivos o Se guardará en un archivo el registro de la señal como una tabla de números. o Se podrá guardar la pantalla desplegada en un archivo de imagen con extensión *.bmp.  Procesamiento de la señal o Filtrado de la señal (para eliminar la mayor cantidad de interferencia posible) o Reconocer los complejos QRS a través de un filtro tipo ventana o Graficar la Transformada Rápida de Fourier (FFT) o Calcular la Variabilidad de la Frecuencia Cardiaca (VFC) Con el editor de Menús construimos el que será necesario para llevar a cabo las siguientes funciones: o Load:  Carga un archivo que contenga datos que puedan graficarse o procesarse. o Save:  Pantalla:  Guarda un archivo con *.BMP con la imagen actual en la interface.  Datos:  Guarda un archivo *.DAT con los datos adquiridos del ECG Portátil. o Salir:  Cierra la interfase y regresa a la pantalla principal de Matlab.

9

 INTERFACE GRÁFICA (ECG PORTATÍL) % -------------------------------------------------------------------Menú principal Options

% -------------------------------------------------------------------% --- Codigo del menu principal Options function Options_Callback(hObject, eventdata, handles) % hObject handle to Opciones (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % -------------------------------------------------------------------Submenú Save

% -------------------------------------------------------------------function Save_Callback(hObject, eventdata, handles) % hObject handle to Save (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % -------------------------------------------------------------------Submenú Pantalla

% -------------------------------------------------------------------% --- Guarda una impresion de la pantalla actual function Screen_Callback(hObject, eventdata, handles) % hObject handle to Screen (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) print -dbitmap; msgbox(' Imagen en el portapapeles')

10

% -------------------------------------------------------------------Submenú Load

% -------------------------------------------------------------------function Load_Callback(hObject, eventdata, handles) % hObject handle to Load (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) axes(handles.axes1) newplot; %prepara el axes1 para una nueva gráfica colordef black; %Permite al usuario elegir el archivo de los datos que desea desplegar en pantalla. [filename, pathname] = uigetfile({'*.dat'},'File Selector'); if(filename~=0) archivo=[pathname filename]; ECG1=load(archivo);%Carga el archivo de datos a la variable ECG1 plot(ECG1,'b'); grid on; % Se etiquetan los ejes y se define el tamaño de la letra ylabel('\bf Amplitud','Fontsize',8); xlabel('\bf Muestras','Fontsize',8); axis([0 3000 (min(ECG1)-1) (max(ECG1)+200)]); set(handles.Procesa,'enable','on'); % Se habilita el botón para procesar la señal handles.original=ECG1; guidata(hObject,handles); end;

11

% -------------------------------------------------------------------Submenú Datos

% -------------------------------------------------------------------function Datos_Callback(hObject, eventdata, handles) % hObject handle to Datos (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) ecg=handles.original; % --- Pide al usuario el nombre para el archivo de datos y el path para guardarlo [file,path] = uiputfile({'*.dat'},'Save as'); if(file~=0) nom=[path file]; end if(file~=0) save(nom,'ecg','-ascii'); msgbox(' Archivo Listo!!','Aviso') end

12

% --------------------------------------------------------------------

Submenú Salir

% -------------------------------------------------------------------function Salir_Callback(hObject, eventdata, handles) % hObject handle to Untitled_1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % -- Solicita la confirmación de salida ans=questdlg('¿Desea salir del programa?','SALIR','Si','No','No'); if strcmp(ans,'No') return; end clear,clc,close all % --------------------------------------------------------------------

Botón para iniciar adquisición

% -------------------------------------------------------------------% --- Executes on button press in Play. % --- Solicita al usuario el tiempo de adquisición en minutos % --- la respuesta se almacena en la variable resp % answer = inputdlg({'Tiempo de Adquisición'}); resp = str2num(answer{1}); % % --- El tiempo en minutos se transforma en numero de muestras

13

% --- y este valor se almacena en la variable tam % numc=resp/0.05; tam=numc*3000; % % --- Configuración del puerto % s=serial('COM1'); set(s,'ReadAsyncMode', 'continuous'); set(s,'InputBufferSize',3000); %tamaño del buffer de entrada tiempo=[0:2999]; %vector del mismo tamaño que le buffer fopen(s); %se abre el puerto fprintf(s,'*IND?'); set(hObject,'BackgroundColor',[0.99 0 0]); %Cambiando el color del botón PLAY % %Cambiando la etiqueta PLAY por ADQUIRIENDO % set(hObject,'String','ADQUIRIENDO'); set(hObject,'enable','off'); %Deshabilitar el botón PLAY para no interrumpir la adquisición if ~isempty(answer) i=0; while i1 data=cat(2,data,datos); end end senial=reshape(data,1,tam); fclose(s); % Cierra el puerto delete(s); %Limpiamos la variable ‘s’ después de cerrar el puerto handles.tam=tam; handles.original=senial; % % Regresamos el botón PLAY a su color original % set(hObject,'BackgroundColor',[0 0.502 0.753]); % % Regresamos la etiqueta original PLAY % set(hObject,'String','PLAY'); set(hObject,'enable','on'); % Habilitamos el botón set(handles.Procesa,'enable','on'); %Habilitamos el botón para procesar la señal guidata(hObject,handles); end

14

% --------------------------------------------------------------------

Botón para procesar la señal

% -------------------------------------------------------------------% --- Executes on button press in Procesa. function Procesa_Callback(hObject, eventdata, handles) % hObject handle to Procesa (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) axes(handles.axes1) newplot; colordef black; ECG1=handles.original; N=size(ECG1); ECG=(ECG1-mean(ECG1))/(500); B=[1 0 0 0 0 0 -2 0 0 0 0 0 1]; A=[1 -2 1]; %s1 es la señal resultante del primer filtrado s1=filter(B,A,ECG); hold on; plot(s1/max(s1),'g'); grid on; %Se grafica s1 set(handles.FC,'enable','on'); % Habilita el botón para calcular la frecuencia cardiaca % Habilita el botón para graficar las ventanas que identican los complejos QRS set(handles.QRS,'enable','on'); % Habilita el botón para graficar el FFT set(handles.FFT,'enable','on'); handles.senial=s1; handles.ecg=ECG; guidata(hObject,handles);

15

% --------------------------------------------------------------------

Botón para identificar los complejos QRS

% -------------------------------------------------------------------% --- Executes on button press in QRS. function QRS_Callback(hObject, eventdata, handles) % hObject handle to QRS (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) axes(handles.axes1) newplot; colordef black; %Filtro Pasa-altas %Definimos las características del filtro pasa-bajas %Sabemos que un filtro puede ser definido con un par de %polinomios que caracterizaran %los polos y ceros de este y así definimos A, B y C. ECG=handles.ecg; s1=handles.senial; B=zeros(1,33); %Comando para generar una matriz de tamaño 1* 33 B(1)=1; B(33)=-1; %Se definen el primer y ultimo elemento como 1 y -1 A=[1 -1]; C=zeros(1,17); C(17)=1; s2=filter(C,1,s1)-filter(B,A,s1)/32; %s2 es la señal resultante del segundo filtrado %Filtro Derivador %Definimos las características del filtro derivador. B=[0.2 0.1 0 -0.1 -0.2]; s3=filter(B,A,s2); %s3 es la señal resultante del tercer filtrado %Area bajo la curva QRS %Gráfica para mostrar el área bajo la curva QRS N=30;delay=30; B=ones(1,N)/N; s4=s3.^2; s4=filter(B,1,s4);%s4 es la señal resultante del segundo filtrado %Filtro Ventana (Duracion del QRS) %En este grafico podemos visualizar a través de ventanas de tiempo la curva QRS. det=s4>(0.125*(max(s4)/2));%Operación para definir el tiempo de duración de la ventana det(1:delay)=[]; %Se define el retardo para que ocurra una nueva ventana plot(max(ECG)*det,'m:'); %Se grafica la ventana de tiempo hold off;

16

% --------------------------------------------------------------------

Botón para calcular la VFC y desplegarla en el cuadro de texto estático en Lat/min

% -------------------------------------------------------------------% --- Executes on button press in VFC. %%%Calcula la variabilidad de la frecuencia cardiaca % Utilizando un algoritmo de detección de ondas R function VFC_Callback(hObject, eventdata, handles) % hObject handle to VFC (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) s=handles.ventana; s4=handles.segunda; cuenta=0; for n=1:5000 dif=s(n+1)-s(n); if dif==max(s) cuenta=cuenta+1; end end NumInt=cuenta; aint=int16(5000/NumInt); may=s4(1); t0=0; t1=0; ini=1; fin=aint; j=1; for i=1:NumInt for n=ini:fin if may
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF