Четыре года назад я уже писал статью на тему обработки кардиограммы. Тогда я показал, как можно перевести бумажную кардиограмму в цифровой формат PCM данных, отрыв затем её в звуковом редакторе. Мне было интересно воспроизвести, послушать и оценить, как это будет звучать. В этот раз предстоит не менее интересная задача. Необходимо разобраться в структуре файла кардиограммы, переписанного с цифрового кардиографа, и извлечь из него всю информацию о кардиограмме в понятном для пользователя виде.
Когда я в поликлинике делал кардиограмму, кроме распечатки я попросил переписать данные с результатом исследования на флешку непосредственно с аппарата. Информация содержится в одном файле с расширением «dat». Разумеется, это не графическая информация (не картинка), как многие могли бы подумать. Имя файла состоит из даты, времени и порядкового номера пациента. Размер файла – 180 кБ. Подразумевается, что для просмотра кардиограммы файл нужно открыть в программе, прилагаемой с кардиографом.
На бумаге кардиограмма выглядит следующим образом.
Ещё справа там была написана аналитическая и диагностическая информация, но я это решил не вставлять в рисунок, так как данная информация не в тему. Внизу написана информация об основных параметрах кардиограммы. Фильтр – 0.67-150 Гц, масштабы – 25 мм/с и 10 мм/мВ, промежутки времени – 4 по 2.5 сек. Кардиограмма записана в 12 стандартных отведениях по 2.5 секунды на каждое. Временная область в 10 сек. поделена на 4 отрезка: [0–2.5] для отведений I, II, III, [2.5–5] для отведений aVR, aVL, aVF, [5–7.5] для отведений V1, V2, V3 и [7.5–10] для отведений V4, V5, V6. Кроме этого, ниже представлена кардиограмма отведения II в варианте с полной длительностью в 10 секунд.
Теперь перейдём к рассмотрению структуры файла с кардиограммой. Ещё по дороге домой я открыл этот файл в HEX редакторе на телефоне (рис. 2). Подвигав скроллбар, я уловил некую периодичность информации по всему содержимому файла. Присмотревшись внимательнее в байты, я разглядел 16-битные числа, близкие к 0, как положительные, так и отрицательные. Причём соседние числа мало отличаются друг от друга.
Дома я открыл данный файл в звуковом редакторе Adobe Audition как 16-битные PCM данные (1 канал, моно). Если внимательно посмотреть на рис. 1, то заметно, что байты данных представлены в порядке big-endian, или смещены на один или другое нечётное количество байт. Это нужно учесть на этапе открытия файла в Adobe Audition, поставив соответствующий параметр (рис. 3).
После процесса открывания файла я увидел следующую картину (рис. 4).
На моё удивление всё оказалось проще, чем я думал: никаких там ADPCM и прочих сжатий и шифровок. Единственное, что меня удивило – данные не нормализированы по амплитуде. На рис. 5 представлено то же самое, но с увеличенным масштабом по вертикали. Как видно, амплитуда кардиограммы составляет порядка -40 дБ. По моей оценке, учитывая бумажную распечатку и масштаб 10мм/мВ, полный уровень амплитуды сигнала 0 дБ составляет порядка 100 мВ. Также на этом же рисунке я условно пронумеровал группы данных, которые визуально различимы.
Группы 1-8 – это составляющие кардиограммы, как на бумаге. Группа 9 – отдельные куски кардиограммы, сразу пока не было ясно, что это. В увеличенном по горизонтали виде они показаны на рис. 6. Здесь содержится 8 разных по форме кусков кардиограмм. Форма каждого такого куска схожа с формой фрагментов основной кардиограммы на соответствующем канале. Например, форма первого куска похожа на форму фрагмента кардиограммы с 1-ого канала, и так далее, до 8. Ещё там между кусками присутствуют постоянные составляющие (DC). Сначала я думал, что это базовые стандартные формы, на которые опирается алгоритм самодиагностики. Но потом я посмотрел спектры этих фрагментов, сравнил со спектрами основных сигналов кардиограммы и пришёл к следующему выводу. Эти куски представляют собой усреднённые результирующие значения всех циклов за 10 секунд записи. Точнее говоря – фрагментов основных переходных фаз кардиограммы. Видимо, именно по этим усреднённым формам алгоритм делает основные измерения и диагностику. А постоянные составляющие – это заполнение пустоты крайними значениями семплов. Размер такого «окна» для хранения усреднённого значения циклов, видимо, фиксированный и составляет 1200 семплов (1.2 сек., 2400 байт). Видимо, предусмотрен гарантированный запас на случай более «вялых» кардиограмм.
Малая часть информации до 1-ой и после 9-ой группы не относится к данным сигнала, и я не занимался её расшифровкой. Информация до 1-ой группы – какой-то заголовок, размером 2031 байт. Байты его окончания представлены на рис. 7. Они выделены выделением HEX редактора. Подавляющее большинство байтов – нули.
Информация после 9-ой группы, как я понял, относится к информации о диагностике. На рисунке 8 представлены байты начала этого информационного блока (начиная от выделенного байта). В текстовой интерпретации некоторых байтов можно увидеть смысловые обозначения.
Опытным путём, опираясь на бумажную распечатку и масштаб по горизонтали, я установил, что частота дискретизации данных сигнала кардиограммы составляет 1 кГц. Всего записано 8 каналов, содержимое которых следует по очереди (в отличие от способа хранения PCM данных многоканального аудио). Длительность сигнала на каждом канале – 10000 семплов, или 10 секунд, как на бумажной кардиограмме. Почему на бумаге 12 отведений, а в файле, по сути, 8 – об этом я напишу позднее.
На рисунке 9 представлена таблица содержимого файла с указанием смещений и размеров блоков. Думаю, в дополнительных комментариях не нуждается. Принимая во внимание принцип однородности информации, обнаружились лишние два байта (число 0x0001), которые я назвал отступом.
Посмотрим, как выглядит спектр сигналов кардиограммы. Для корректности отображения шкалы времени и частот я открыл файл как PCM данные с нужной частотой дискретизации 1 кГц, хоть и нестандартной для звукового оборудования. При необходимости прослушивания кардиограммы нужно в Adobe Audition выполнить апсемплинг с интерполяцией. На рисунке 10 показан волновой и спектральный виды сигнала первых двух каналов. Я открыл файл в более свежей версии Adobe Audition, где есть возможность показать сразу два вида, один под другим.
На спектре кроме полезной информации наблюдаются помехи в виде шума и тонов 150, 200 и 250 Гц. Я не знаю род этих помех, но могу лишь отметить, что самим кардиографом они не подавлены, вопреки написанной информации о фильтре на бумажной версии кардиограммы (рис. 1). Или же данный фильтр применяется на более раннем этапе обработки и преобразования, или же у него не такая резкая характеристика. В любом случае, как показала практика, данные помехи не оказывают существенного влияния на волновой вид кардиограммы, особенно на распечатке. Высокочастотные незначительные помехи, возможно, маскируются погрешностью печати. Или же фильтр применяется только к печати, а в файл записываются данные без применения фильтра. Тон 150 Гц на втором канале чуть «громче», чем на первом. Те же помехи наблюдаются на спектрах кусков (усреднений) периодов, о которых я писал выше. Именно эта особенность и помогла мне сделать более обоснованные умозаключения.
Затем стал вопрос о несоответствии количества отведений и каналов. У меня были некие предположения для объяснения этого момента. Быстренько изучив матчасть, я убедился, что мои мысли были на правильном пути. Внимательно рассматривая формы, сравнивая их с бумажным вариантом, я пришёл к выводу, что по каналам записаны отведения в следующем порядке: I, II, V1, V2, V3, V4, V5, V6. То есть, не хватает отведений III, aVR, aVL и aVF.
Шесть сигналов (I, II, III, aVR, aVL и aVF) представляются в виде векторов, как показано на рисунке 11.
Достаточно знать сигналы I и II, а остальные сигналы вычисляются с помощью векторных операций, базирующиеся на школьной математике. Грубо говоря, III = II – I; aVL = (I - III)/2; aVR = -(I + II)/2; aVF = (II + III)/2. Данные арифметические операции над сигналами я произвёл в Adobe Audition, получив 4 сигнала с недостающих отведений. Их вид на соответствующих участках времени совпадает с видом на бумаге.
В заключение, ради интереса я решил посмотреть фазовую кривую (анализ фазы) между двумя сигналами, векторы которых перпендикулярны, а именно – I и aVF. Именно перпендикулярных, так как фазовая плоскость в звуковых редакторах представлена в прямоугольной системе координат. Я подготовил файл формата «1 кГц 16 бит Стерео», в левый канал поместил сигнал aVF, а в правый – I (рис. 12). Затем открыл окно инструмента «Анализ фазы» и поставил максимальное число отсчётов отображаемой кривой 65536. В сигнале на 10 сек. всего 10000 семплов (отсчётов). Тем самым кривая отобразится полностью без необходимости проигрывания файла. Вид фазовой кривой представлен на рисунке 13. С точки зрения математики данная кривая представляет собой график параметрической функции, которая задаётся составляющими левого и правого каналов.
Ввиду цикличности сигнала кардиограммы фазовая кривая также циклична, и также есть небольшие разбросы и отклонения. А в целом вырисовывается определённая картина, связанная с формой кривой. Как и в случае с видом кардиограммы, на фазовой кривой также выделяются три основных участка, которые называются P, QRS и T. Это показано на рисунках 14 и 15, где фазовая кривая нарисована только для одного цикла. На рисунке 14 точками кью приблизительно помечены участки P, QRS и T. А на рисунке 15 я не стал помечать эти участки, так как мне не удаётся это сделать красиво. Самая большая фигура в виде петли, которую рисует фазовая кривая, относится к QRS участку. Участки P и T представляют собой две небольшие петли, расположенные в первой четверти системы координат, они малозаметны.
Мне стало интересно, применяется ли подобная аналитика в медицине при диагностике в более сложных аппаратах? Можно ли по виду данной фазовой кривой судить о значении угла ЭОС? Эти вопросы уже выходят за рамки данной статьи. В Интернете я пытался найти что-либо про анализ фазы в кардиографии. Максимум, что я нашёл – применение похожего анализа фазы между сигналом одного конкретного отведения и сигналом его производной (например, I и I’) (рис. 16). Но в данном случае формы кривых, разумеется, уже совсем другие.