El European Data Format, casi siempre abreviado como EDF, es el formato abierto más utilizado para registros fisiológicos de larga duración. Los laboratorios de sueño exportan en él las polisomnografías, los equipos de EEG lo usan para estudios rutinarios y ambulatorios, y las bases de datos públicas de investigación distribuyen miles de horas de señales como archivos EDF. Su éxito se debe a la misma propiedad que lo hace fácil de inspeccionar: una estructura fija y muy sencilla que apenas ha cambiado desde 1992.
Un Poco de Historia
Bob Kemp y sus colaboradores publicaron EDF en 1992 como formato común para intercambiar registros poligráficos digitalizados entre laboratorios con equipos incompatibles. En 2003 Kemp y Olivan publicaron EDF+, una extensión compatible hacia atrás que añade anotaciones de texto normalizadas, identificación estructurada del paciente y del registro, y soporte para registros con interrupciones. Por la misma época el fabricante BioSemi introdujo BDF, una variante con muestras de 24 bits para EEG de alta resolución. Las tres comparten la misma estructura de cabecera, y por eso un único visor puede leerlas todas.
La Cabecera: Texto Plano con Anchos Fijos
Todo archivo EDF empieza con una cabecera de 256 bytes escrita en caracteres ASCII imprimibles. Cada campo tiene un ancho fijo y se rellena con espacios:
- Versión (8 bytes): el texto
0 en EDF, o el byte 255 seguido de BIOSEMI en BDF.
- Identificación local del paciente y del registro (80 bytes cada una): texto libre en EDF y subcampos estructurados en EDF+.
- Fecha y hora de inicio (8 bytes cada una), con el formato
dd.mm.aa y hh.mm.ss. Los años de dos cifras del 85 al 99 corresponden a 1985–1999, y del 00 al 84 a 2000–2084.
- Número de bytes de la cabecera, un campo reservado que EDF+ usa para
EDF+C o EDF+D, el número de registros de datos, la duración de un registro en segundos y el número de señales.
Tras esta parte fija vienen otros 256 bytes por cada señal. Los campos de señal se guardan por columnas: primero todas las etiquetas, después todos los tipos de transductor, luego todas las unidades físicas, y así sucesivamente. Para cada señal la cabecera indica una etiqueta de 16 caracteres como EEG Fpz-Cz, el transductor, la unidad física, el mínimo y máximo físicos, el mínimo y máximo digitales, una descripción del prefiltrado como HP:0.3Hz LP:35Hz y el número de muestras de cada registro de datos.
Registros de Datos y Frecuencias de Muestreo
Los datos siguen a la cabecera como una serie de registros de igual longitud. Cada registro contiene un número fijo de muestras de cada señal, una señal detrás de otra. Las muestras son enteros de 16 bits en complemento a dos, en orden little-endian, en EDF, y enteros de 24 bits en BDF. Las señales no tienen por qué compartir frecuencia: un registro de 30 segundos puede contener 3.000 muestras de EEG a 100 Hz, 6.000 de ECG a 200 Hz y solo 30 de saturación de oxígeno a 1 Hz. La frecuencia de una señal es simplemente su número de muestras por registro dividido entre la duración del registro.
Como todos los registros tienen el mismo tamaño, cualquier momento del registro se localiza con aritmética, sin recorrer el archivo: el desplazamiento del registro n es el tamaño de la cabecera más n veces el tamaño del registro. Eso es lo que permite a este visor abrir un archivo de varios gigabytes y mostrar cualquier ventana de diez segundos casi al instante.
De Valores Digitales a Unidades Físicas
Los enteros del archivo no son microvoltios ni porcentajes. Se convierten con una recta definida por los cuatro campos de rango de cada señal: el mínimo digital corresponde al mínimo físico y el máximo digital al máximo físico. La ganancia es el rango físico dividido entre el rango digital, y cada valor intermedio se escala linealmente. Si una cabecera declara un mínimo digital que no es menor que el máximo digital, o límites físicos iguales, la conversión no está definida, y la herramienta lo avisa en vez de dibujar valores sin sentido.
Los límites digitales suelen describir los valores extremos que podían producir el amplificador y el conversor. Cuando muchas muestras caen exactamente en uno de esos límites, lo más probable es que la entrada superase el rango de medida: un electrodo suelto, un artefacto de movimiento o una ganancia demasiado alta. La columna de muestras recortadas de la tabla de señales las cuenta para que detectes los canales saturados de un vistazo.
Qué Añade EDF+
EDF+ mantiene la estructura original y añade convenciones encima. El campo de paciente pasa a tener cuatro subcampos separados por espacios —código hospitalario, sexo, fecha de nacimiento y nombre—, donde los espacios dentro de un subcampo se sustituyen por guiones bajos y un valor desconocido se escribe como X. El campo de registro empieza con la palabra Startdate, seguida de la fecha completa, un código administrativo, el técnico y el equipo.
La novedad más importante es la señal EDF Annotations. Se guarda como una señal normal, pero contiene texto en lugar de muestras: listas de anotaciones con marca de tiempo, o TAL. Cada TAL empieza con un instante en segundos relativo al inicio del archivo, opcionalmente una duración, y uno o varios textos, separados por los bytes 20 y 21 y terminados con un byte cero. Ahí viven las fases de sueño, los microdespertares, las apneas, los marcadores de estímulo y las notas del técnico. La primera TAL de cada registro es una entrada de cronometraje con texto vacío que indica cuándo empieza ese registro.
Registros Continuos y Discontinuos
Un archivo EDF+C es continuo: el registro n empieza exactamente n veces la duración del registro después del inicio del archivo. Un archivo EDF+D es discontinuo, lo que encaja con registradores de eventos o estudios de potenciales evocados que solo guardan tramos seleccionados. En ese caso la anotación de cronometraje es la única fuente fiable de la hora de cada registro, así que este visor la lee en todos los registros y dibuja una marca donde el registro salta hacia delante.
Problemas Habituales en Archivos Reales
Como EDF es sencillo, muchos programas lo escriben, y no todos aciertan en cada detalle. Los problemas más frecuentes en la práctica son:
- Un número de registros igual a -1. La especificación lo permite mientras el registro está en curso, pero algunos archivos nunca se cierran. El número real se puede recuperar a partir del tamaño del archivo.
- Archivos truncados. Una copia interrumpida o un disco lleno dejan un último registro incompleto. Los lectores que se fían de la cabecera fallan o leen más allá del final.
- Tamaño de cabecera erróneo. El número de bytes de cabecera declarado debe ser 256 por el número de señales más uno. Si no coincide, los lectores discrepan sobre dónde empiezan los datos.
- Fechas imposibles y caracteres no ASCII. Los caracteres locales en nombres o etiquetas rompen a los analizadores estrictos, y fechas imposibles como el 31 de febrero aparecen más de lo que cabría esperar.
Cada uno de ellos genera un aviso concreto y legible en la herramienta, lo que suele bastar para entender por qué otro programa rechaza el archivo.
Cuándo No Usar Esta Herramienta
Este visor está pensado para inspección, control de calidad y resolución de problemas. No aplica montajes, filtros digitales ni estadificación del sueño, y muestra deliberadamente los datos tal como están guardados, no como los presentaría un sistema de revisión clínica. Para la lectura diagnóstica usa software clínico certificado. Para convertir o analizar muchos archivos en lote, una librería como MNE-Python o pyEDFlib encaja mejor; esta herramienta es la forma rápida de comprobar, archivo por archivo, qué van a recibir realmente esos scripts.