facultad de ingeniería universidad de mendoza

31
Facultad de Ingeniería UNIVERSIDAD DE MENDOZA Pasaje Descote750 5500 Mendoza República Argentina Teléfono 061-201872 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

Upload: garima

Post on 19-Mar-2016

38 views

Category:

Documents


3 download

DESCRIPTION

Facultad de Ingeniería UNIVERSIDAD DE MENDOZA Pasaje Descote750 5500 Mendoza República Argentina Teléfono 061-201872. 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. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

Facultad de Ingeniería UNIVERSIDAD DE MENDOZA

Pasaje Descote7505500 Mendoza

República ArgentinaTeléfono 061-201872

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

Page 2: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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 www.physionet.org.

El WFDB Toolbox para MATLAB

Page 3: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

Al momento, están implementadas las siguientes funciones:

rdann Lee archivos de anotaciones para registros WFDB sdsamp Lee archivos de señal WFDB de registros WFDBSetwfdb Pone paths WFDB a valores defaultTime2sec Convierte intervalos de tiempo formato WFDB en segundos wfdb_config retorna información de versión y compilación acerca de la librería WFDBWfdbdesc retorna especificaciones para señales en registros WFDB Wfdbwhich Encuentra la locación de archivos pertenecientes a registros WFDB Wrann Escribe anotaciones para registros WFDB en los archivos de anotacionesWrsamp Escribe datos de señal en registros WFDB-compatibles

El WFDB Toolbox para MATLAB

Page 4: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 5: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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)

Page 6: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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)

Page 7: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 8: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 9: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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)

Page 10: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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 muestratypeMnemonic (string): El nemónico para el tipo de anotaciónsubtype (uint8): el campo sub-tipo de anotaciónchan (uint8): el campo chan de la anotaciónnum (uint8): el campo num de la anotaciónauxInfo (string): un string de información auxiliar para la anotación

Lectura de archivo de anotación

Page 11: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 12: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 13: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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 = 18 77 370 662 946>> char(B(1:5,3))‘ans =+NNNN

Lectura de archivo de anotación

Page 14: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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 = 18 2044 66792ans =+AAOtro 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

Page 15: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 16: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

'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

Page 17: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

Ejemplos % retorna todas las señales del registro 'mitdb/100‘ en rr=rdsamp('mitdb/100'); size(r)ans = 650000 3

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

Page 18: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

% 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

Page 19: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

% 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 arranqueR1=rdsamp('mitdb/101','begin','00:00:10','stop','00:02:30','hires',true); R1(1:3,1:3)

ans = 3600 952 1004 3601 954 1002 3602 957 1003

% retorna solo la primera señal (i.e. "numero cero") de % 'mitdb/101'R2=rdsamp('mitdb/101','sigs',1); R2(1:3,:)

ans =

0 992 1 992 2 992

Lectura de archivo de señal

Page 20: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 21: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 22: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 23: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 24: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

'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

Page 25: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 26: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

Para verificar lo ocurrido, se tipean las siguientes instrucciones:

% Lectura del archivo 100copyr2=rdsamp('100copy');r2(1:5,1:end)‘ans =

0 1 2 3 4 995 995 995 995 995 1011 1011 1011 1011 1011

% Lectura del archivo 100dupr1=rdsamp('100dup');r1(1:5,1:end)‘ans =

0 1 2 3 4 995 994 992 993 992 995 994 992 993 992 995 994 992 993 992

Escritura de archivo de señal

Page 27: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 28: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 29: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

Examples % Se adquieren anotaciones existentesa = 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 = 0.0500ans = 18

Escritura de archivo de anotación

Page 30: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

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

Page 31: Facultad de Ingeniería  UNIVERSIDAD DE MENDOZA

Examplos: % encuentra el archivo llamado '100.dat‘fp = wfdbwhich('100.dat') fp = http://physionet.org/physiobank/database/mitdb/100.dat % encuentra el archivo de tipo 'hea' (header), en % el registro 'mitdb/100' fp = wfdbwhich('hea', 'mitdb/100') fp = http://physionet.org/physiobank/database/mitdb/100.hea

Encontrar ubicación de archivos