La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Facultad de Ingeniería UNIVERSIDAD DE MENDOZA Pasaje Descote750 5500 Mendoza República Argentina Teléfono 061-201872 CURSO EXPERIMENTACIÓN CON BASES DE.

Presentaciones similares


Presentación del tema: "Facultad de Ingeniería UNIVERSIDAD DE MENDOZA Pasaje Descote750 5500 Mendoza República Argentina Teléfono 061-201872 CURSO EXPERIMENTACIÓN CON BASES DE."— Transcripción de la presentación:

1 Facultad de Ingeniería UNIVERSIDAD DE MENDOZA Pasaje Descote Mendoza República Argentina Teléfono CURSO EXPERIMENTACIÓN CON BASES DE DATOS DE SEÑALES CARDIOLÓGICAS. RECURSOS DE PHYSIONET. DICTADO POR: DR. ING. JESÚS RUBÉN AZOR MONTOYA 2011

2 Esta es una colección de aplicaciones WFDB implementadas como funciones en MATLAB. WFDB es una aplicación que permite leer y escribir archivos en los formatos usados por PhysioBank databases. Por default, el Toolbox WFDB para Matlab soporta la lectura directa de registros desde el PhysioBank sobre la web. Por ejemplo, en MATLAB, se puede simplemente descargar y graficar una señal >> r = rdsamp('mitdb/100', 'maxt', ':10'); >> plot(r(:,1), r(:,2)); Lo cual permite obtener en una matriz r los datos del registro ubicado en la carpeta mitdb desde El WFDB Toolbox para MATLAB

3 Al momento, están implementadas las siguientes funciones: rdann Lee archivos de anotaciones para registros WFDB sdsampLee archivos de señal WFDB de registros WFDB SetwfdbPone paths WFDB a valores default Time2secConvierte intervalos de tiempo formato WFDB en segundos wfdb_configretorna información de versión y compilación acerca de la librería WFDB Wfdbdescretorna especificaciones para señales en registros WFDB WfdbwhichEncuentra la locación de archivos pertenecientes a registros WFDB WrannEscribe anotaciones para registros WFDB en los archivos de anotaciones Wrsamp Escribe datos de señal en registros WFDB-compatibles El WFDB Toolbox para MATLAB

4 La biblioteca WFDB ha evolucionado para apoyar el desarrollo de numerosas otras bases de datos que incluyen señales como a)presión sanguínea, b)Respiración, c)Saturación de oxígeno, d)EEG, así como ECG. Entre estas bases de datos de múltiples parámetros están: 1)MGH/Marquette Foundation Waveform Database, 2)MITBIH 3)MIMIC Database. De este modo, la biblioteca WFDB es mucho más que una interfaz de Base de Datos de ECG. El WFDB Toolbox para MATLAB

5 Las bases de datos para las cuales fue diseñada la librería WFDB consisten de un pequeño número de registros, cada uno de los cuales es muy grande (típicamente Mbytes o más). Antes de 1990, los registros de la base de datos usualmente se originaban como grabaciones en cinta analógica, aunque muchas de las recientemente creadas son grabadas digitalmente en disco. Cada registro contiene una grabación continua de un único sujeto. Un programa de aplicación típica accede sólo a un único registro, y la mayoría (no todos) de los accesos dentro del registro es secuencial. Los registros son identificados por record names de hasta 20 caracteres. Por ejemplo, record names en la MIT DB son números de tres dígitos. Un registro se compone de varios archivos, que contienen las señales, las anotaciones, y las especificaciones de los atributos de la señal, cada archivo perteneciente a un registro dado incluye normalmente el nombre del registro (record name) como la primera parte de su nombre. Registros (Records)

6 Las bases de datos para las cuales fue diseñada la librería WFDB consisten de un pequeño número de registros, cada uno de los cuales es muy grande (típicamente Mbytes o más). Antes de 1990, los registros de la base de datos usualmente se originaban como grabaciones en cinta analógica, aunque muchas de las recientemente creadas son grabadas digitalmente en disco. Cada registro contiene una grabación continua de un único sujeto. Un programa de aplicación típica accede sólo a un único registro, y la mayoría (no todos) de los accesos dentro del registro es secuencial. Los registros son identificados por record names de hasta 20 caracteres. Por ejemplo, record names en la MIT DB son números de tres dígitos. Un registro se compone de varios archivos, que contienen las señales, las anotaciones, y las especificaciones de los atributos de la señal, cada archivo perteneciente a un registro dado incluye normalmente el nombre del registro (record name) como la primera parte de su nombre. Registros (Records)

7 Las señales son comúnmente comprendidas como funciones del tiempo obtenidas por observación de las variables físicas. En esta guía, una señal es definida más restrictivamente como una secuencia de muestras enteras, usualmente obtenidas de la digitalizacón de una función continua del tiempo observada a una frecuencia de muestreo fija expresada en Hz (muestras por segundo). El intervalo de tiempo entre cualquier par de muestras adyacentes en una señal dada, es un intervalo de muestreo. Todos los intervalos de muestreo para una señal dada son iguales. El valor entero de cada muestra es usualmente interpretado como una tensión, y las unidades son llamadas unidades de convertidor AD, o adu. La ganancia definida para cada señal especifica a cuántas adus corresponde una unidad física (usualmente 1 mV). Señales, Muestras, y Tiempo

8 Todas las señales en un registro dado están usualmente muestreadas a la misma frecuencia, pero no necesariamente con la misma ganancia. Los registros MIT DB están muestreados a 360 Hz; los AHA y ESC DB a 250 Hz. El número de la muestra (sample number) es un atributo de una muestra, se define como el número de muestra de la misma señal que lo precede, así el número de muestra de la primera muestra es cero. Dentro de esta guía, las unidades de tiempo son intervalos de muestreo, de ahí que el "tiempo" de una muestra es sinónimo de su número de muestra. Las muestras con el mismo número de muestra en diferentes señales del mismo registro son tratados como simultáneos. Señales, Muestras, y Tiempo

9 Los registros MIT DB tiene cada uno 30 minutos de duración, y se anota en todos; con esto se quiere decir que cada latido (complejo QRS) se describe mediante una etiqueta llamada anotación. Típicamente un archivo de anotación para un registro MIT DB contiene cerca de 2000 anotaciones de latido, y números menores de anotaciones de ritmo y calidad de señal. Los registros AHA DB (AHA es una base de datos para evaluación de detectores de arritmia ventricular. )son o bien de 35 minutos o de tres horas de duración, y sólo los 30 últimos minutos de cada registro son anotados. Los registros ESC DB (La base de datos European ST-T, consistente de 90 registros identificados por nombres con el prefijo e y cuatro dígitos ) son cada uno de 2 horas de longitud, y se anota todo. El tiempo de una anotación es simplemente el número de la muestra con la cual está asociada la anotación. Las anotaciones pueden estar asociadas con una única señal, si se desea. Anotaciones (Annotations)

10 function [anns] = rdann(timeInSeconds record, annotator,...) Lee el archivo de anotación para el registro especificado y anotador, y lo retorna como una estructura en forma de arreglo legible por humanos, con una entrada por anotación. Puede ser usada una opción concisa para indicar, en su lugar, que sólo los tiempos de las anotaciones deben ser devueltos, en este caso, el valor de retorno no es una estructura amplia, sino una matriz de dos columnas. El arreglo de estructura no-concisa tiene los siguientes campos: timeInSeconds (number): El tiempo de la anotación en segundos sampleNumber (unit): El tiempo de la anotación en muestra typeMnemonic (string): El nemónico para el tipo de anotación subtype (uint8): el campo sub-tipo de anotación chan (uint8): el campo chan de la anotación num (uint8): el campo num de la anotación auxInfo (string): un string de información auxiliar para la anotación Lectura de archivo de anotación

11 Se requieren dos argumentos: record: el nombre del registro WFDB annotator: el nombre del anotador para el registro dado Seis argumentos opcionales (valores default en []s): 'start' (string tiempo-formato): el tiempo en registro desde el cual se comienza la lectura ['00:00:00'] 'stop' (string tiempo-formato): el tiempo en registro desde el cual se termina la lectura [end of record] 'chan' (int8): el número "chan" para anotaciones a ser retornadas (todas las otras anotaciones no son retornadas) [] 'num' (int8): el número "num" para anotaciones a ser (todas las otras anotaciones no son retornadas) [] 'subtype' (int8): el número "subtipo" para anotaciones a ser retornadas (todas las otras anotaciones no son retornadas) [] 'type' (1 o más strings): nemónicos de los tipos para anotaciones a ser retornadas (todas las otras anotaciones no son retornadas) [] 'concise' (0 ó 1 booleano): retorna sólo dos columnas: la primera de los tiempos de anotación, y la segunda de los números de muestra de la anotación Lectura de archivo de anotación

12 Ejemplos: clear >> % retorna todas las anotaciones del registro 'mitdb/100 >> % con el anotador 'atr >> A=rdann('mitdb/100', 'atr') 1x2274 struct array with fields: timeInSeconds sampleNumber typeMnemonic subtype chan num auxInfo Se observa que A es una estructura cuyos valores se averiguan para el campo timeInSeconds los 10 primeros valores se hallan con: >> for i=1:10;B(i)=A(i).timeInSeconds;end Lectura de archivo de anotación

13 Para sacar los datos del registro como un arreglo, se puede utilizar el siguiente segmento: A=rdann('mitdb/100', 'atr'); B=0; for i=1:10; B(i,1)=A(i).timeInSeconds; B(i,2)=A(i).sampleNumber; B(i,3)=char(A(i).typeMnemonic); B(i,4)=char(A(i).subtype); End Parte del arreglo B es: >> B(1:5,2) ans = >> char(B(1:5,3)) ans = +NNNN Lectura de archivo de anotación

14 Para sacar los datos del registro como un arreglo, se puede utilizar el siguiente segmento: D=rdann('mitdb/100', 'atr', 'type', 'A', '+'); B=0; for i=1:10; B(i,1)=D(i).sampleNumber; B(i,2)=char(D(i).typeMnemonic); end Parte del arreglo B es: >> B(1:3,1)',char(B(1:3,2)) ans = ans = +AA Otro ejemplo: % retorna todas las anotaciones del registro 'mitdb/100' entre % 1 min. y 1 min. 30 seg., con chan 0 y subtype 0 rdann('mitdb/100', 'atr', 'start', '00:01:00', 'stop',... '00:01:30', 'chan', 0, 'subtype', 0) Lectura de archivo de anotación

15 function [S] = rdsamp(record,...) Lee archivos de señal WFDB para el registro especificado y retorna las muestras como vectores columna. La Columna 1 de la salida es siempre un vector del número de muestra. Las columnas remanentes son vectores de las señales del registro. Se requiere sólo un argumento: record: el nombre del registro WFDB. Tiene seis argumentos opcionales (valores default en []s): 'begin' (string tiempo-formato): el tiempo en el registro desde el cual se empieza a leer ['00:00:00'] 'maxt' (string tiempo-formato): límite superior en tiempo, sobre la cantidad de salidas producidas [no limit] 'stop' (string tiempo-formato): el tiempo en el registro desde el cual se empieza a leer ['00:00:00'] [end of record] Lectura de archivo de señal

16 'hires' (booleano): si o no lee en modo alta resolución; idéntico para registros ordinarios, sino para registros multifrecuencia, la decimación estándar de sobremuestreo para la frame rate es suprimida (todas las otras señales son remuestreadas a la más alta frecuencia de muestreo [false] 'phys' (booleano): si o no retorna valores de señal como aquellos de sus respectivas unidades físicas, en vez de unidades A/D crudas [false] 'sigs' (1 o más uint32's): los números de señal de las señales a ser retornadas (0- indexado) [todos los números de señal, en orden] Note que los valores de 'begin', 'maxt', y 'stop' se espera que sean strings formato- tiempo" de la forma 'AB:CD:EF' (donde A a F representa dígitos simples); e.g., '00:00:00' representa tiempo cero, '00:00:05' cinco segundos, '00:05:00' cinco minutos, y así siguiendo. El valor de 'maxt' es estrictamente un límite superior: si la longitud de tiempo entre 'begin' y 'stop' es mayor que 'maxt', entonces el tiempo de parada actual es 'begin' + 'maxt'. Los argumentos opcionales se especifican como parámetro/valor, donde el parámetro es un string. Lectura de archivo de señal

17 Ejemplos % retorna todas las señales del registro 'mitdb/100 en r r=rdsamp('mitdb/100'); size(r) ans = Si se quiere ver gráficamente la primera derivación: x=r(1:1000,1);y=r(1:1000,2); plot(x,y) Lectura de archivo de señal

18 % retorna todas las señales del registro 'mitdb/100', % en unidades físicas r=rdsamp('mitdb/100','phys',true); x=r(1:1000,1);y=r(1:1000,2); plot(x,y) Lectura de archivo de señal

19 % retorna todas las señales del registro 'mitdb/100', en modo % high-res, comenzando en 10 segundos desde el arranque, y terminando en 2 min. 30 seg. desde el arranque R1=rdsamp('mitdb/101','begin','00:00:10','stop','00:02:30','h ires',true); R1(1:3,1:3) ans = % retorna solo la primera señal (i.e. "numero cero") de % 'mitdb/101' R2=rdsamp('mitdb/101','sigs',1); R2(1:3,:) ans = Lectura de archivo de señal

20 function [s] = time2sec(time,...) Convierte un string tiempo-formato en un número de segundos Si el string tiempo-formato dado es encerrado entre corchetes (por ejemplo, '[9:0:0]') y si el registro está dado (como un argumento opcional), entonces el valor retornado es el tiempo transcurrido desde el comienzo del registro. Se requiere un argumento: time: el string tiempo-formato indicando el tiempo a convertir Un argumento opcional: 'record' (string): el registro sobre el cual basar la conversión, si es requerida la conversión time-of-day, como se describe debajo Conversión a segundos

21 function [] = wrsamp(cols, record,...) Crea un registro con datos y nombre dados. La creción de un nuevo registro implica la creación del archivo llamado [record,'.dat'], y el archivo llamado [record,'.hea']. wrsamp() puede ser usado casi como una relación inversa a rdsamp), excepto que mientras la primer columna retornada por rdsamp() es un vector de números de muestras, las columnas pasadas por wrsamp() son sólo señales de datos. Nada es retornado. Se requieren dos argumentos: cols: las señales a escribir, como vectores columna record: el nombre del registro a crear Escritura de archivo de señal

22 function [] = wrsamp(cols, record,...) Crea un registro con datos y nombre dados. La creción de un nuevo registro implica la creación del archivo llamado [record,'.dat'], y el archivo llamado [record,'.hea']. wrsamp() puede ser usado casi como una relación inversa a rdsamp), excepto que mientras la primer columna retornada por rdsamp() es un vector de números de muestras, las columnas pasadas por wrsamp() son sólo señales de datos. Nada es retornado. Se requieren dos argumentos: cols: las señales a escribir, como vectores columna record: el nombre del registro a crear Escritura de archivo de señal

23 Hay siete argumentos opcionales (valores default en []s): 'inputname' (string): si no-nulo, esto es usado en la descripción (el campo 'desc') de cada señal [null] 'dither' (boolean): si o no vacilar (dither) los datos en columnas antes de convertirlo a salida entera [false] 'start' (uint): el número de muestra desde la cual comenzar a escribir, con índice 0-based; todos los datos anteriores son ignorados [0] 'stop' (uint): el número de muestra desde la cual parar de escribir; sólo los datos anteriores a ella son usados [end of data, en este caso, size(cols,1)+1] Escritura de archivo de señal

24 'freq' (number): la frecuencia de muestreo de cada una de las señales, en muestras por segundo; sólo afecta la escritura del archivo de cabecera escrito [250] 'gain' (0 o más números): la ganancia (en unidades A/D por milivoltio) de las señales; valores múltiples pueden ser dados, hasta el número de señales, y si N valores son dados para M señales y N < M, todas las señales después de la N-ésima tendrán la misma ganancia que la N-ésima; sólo afecta la escritura del archivo de cabecera escrito [200] 'scale' (0 o más números): un factor por el cual escalar todas las muestras en las señales; multiplea valores pueden ser dados, comportando exactamente como "ganancia" por encima para señales múltiples; afecta a la archivo de datos al cambiar la señal de datos [1] Escritura de archivo de señal

25 Ejemplo: % adquiere datos existentes d = rdsamp('mitdb/100','begin','00:00:00','stop','00:01:00'); % saca una copia del registro 'mitdb/100', llamado 100copy', % consistente de archivos locales 100copy.dat' y % 100copy.hea note que saltamos la primera columna % retornada por rdsamp()(los números de muestra) wrsamp(d(:,2:3), '100copy'); % triplica la primera señal del registro 'mitdb/100', y % escribe estas al registro 100dup'; salta las primeras % 10 muestras wrsamp([d(:,2), d(:,2), d(:,2)], '100dup', 'start', 10) Escritura de archivo de señal

26 Para verificar lo ocurrido, se tipean las siguientes instrucciones: % Lectura del archivo 100copy r2=rdsamp('100copy');r2(1:5,1:end) ans = % Lectura del archivo 100dup r1=rdsamp('100dup');r1(1:5,1:end) ans = Escritura de archivo de señal

27 function [] = wrann(annots, record, annotator) Dado un vector columna de anotaciones, escribe un nuevo archivo de anotación para un registro. El archivo de anotación es escrito localmente, usando el nombre de registro como la base del nombre de registro, y el nombre del anotador como su extensión. Nada es retornado. Se requieren tres argumentos: annots: un arreglo estructura vector columna manteniendo las anotaciones a escribir fuera; el formato del arreglo estructura deberá ser exactamente el mismo como el retornado por rdann(), y se describe debajo. record: el nombre del registro al cual escribir el archivo de anotación annotator: el nombre del anotador; es también el sufijo del archivo de anotación. Escritura de archivo de anotación

28 El arreglo estructura annots deberá tener los siguientes campos: timeInSeconds (number): el tiempo de las anotaciones en segundos sampleNumber (uint): el tiempo de las anotaciones en muestras typeMnemonic (string): los mnemónicos para el tipo de anotación subtype (uint8): el campo subtype de anotación chan (uint8): el campo chan de anotación num (uint8): el campo num de anotación auxInfo (string): un string de información auxiliar para la anotación Escritura de archivo de anotación

29 Examples % Se adquieren anotaciones existentes a = rdann('mitdb/100', 'atr'); % escribe anotaciones para el registro 'mitdb/100', al archivo % de anotación local wrann(a, '100', 'atr'); Si se quiere leer los primeros valores de 100: >> b = rdann('100', 'atr'); b(1).timeInSeconds, b(1).sampleNumber ans = ans = 18 Escritura de archivo de anotación

30 function [fp] = wfdbwhich(filename) function [fp] = wfdbwhich(filename, 'record', substRecord) function [fp] = wfdbwhich(filetype, record) Busca la senda (path) para el archivo con un nombre específico o para el archivo con un file type dado en un registro dado. wfdbwhich() puede ser llamada de tres formas. wfdbwhich(filename) busca el path WFDB y retorna la ubicación plena del nombre de archivo (filename), si es encontrada. wfdbwhich(filetype, record) busca por un archivo dado que tenga una extensión dada por filetype (un string), en el registro dado. wfdbwhich(filename, 'record', substRecord) puede ser usado cuando el path WFDB acesible mediante getenv('WFDB') contiene el string '%r', en cuyo caso se comporta tal como wfdbwhich(filename) excepto que sustituye substRecord por '%r' en el path. Para cualquiera de los tres casos, si un path no se encuentra, se retorna el ([]). Encontrar ubicación de archivos

31 Examplos: % encuentra el archivo llamado '100.dat fp = wfdbwhich('100.dat') fp = % encuentra el archivo de tipo 'hea' (header), en % el registro 'mitdb/100' fp = wfdbwhich('hea', 'mitdb/100') fp = Encontrar ubicación de archivos


Descargar ppt "Facultad de Ingeniería UNIVERSIDAD DE MENDOZA Pasaje Descote750 5500 Mendoza República Argentina Teléfono 061-201872 CURSO EXPERIMENTACIÓN CON BASES DE."

Presentaciones similares


Anuncios Google