Четыре года назад я уже писал статью на тему обработки кардиограммы. Тогда я показал, как можно перевести бумажную кардиограмму в цифровой формат PCM данных, открыв затем её в звуковом редакторе. Мне было интересно воспроизвести, послушать и оценить, как это будет звучать. В этот раз предстоит не менее интересная задача. Необходимо разобраться в структуре файла кардиограммы, переписанного с цифрового кардиографа, и извлечь из него всю информацию о кардиограмме в понятном для пользователя виде.
Когда я в поликлинике делал кардиограмму, кроме распечатки я попросил переписать данные с результатом исследования на флешку непосредственно с аппарата. Информация содержится в одном файле с расширением «dat». Разумеется, это не графическая информация (не картинка), как многие могли бы подумать. Имя файла состоит из даты, времени и порядкового номера пациента. Размер файла – 180 кБ. Подразумевается, что для просмотра кардиограммы файл нужно открыть в программе, прилагаемой с кардиографом.
На бумаге кардиограмма выглядит следующим образом.
![Рис. 1. Кардиограмма на бумаге. Рис. 1. Кардиограмма на бумаге.](https://habrastorage.org/getpro/habr/upload_files/c0a/67c/a18/c0a67ca1842c9652bba400e1d0e91d4c.png)
Ещё справа там была написана аналитическая и диагностическая информация, но я это решил не вставлять в рисунок, так как данная информация не в тему. Внизу написана информация об основных параметрах кардиограммы. Фильтр – 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, как положительные, так и отрицательные. Причём соседние числа мало отличаются друг от друга.
![Рис. 2. Вид файла кардиограммы в HEX редакторе. Рис. 2. Вид файла кардиограммы в HEX редакторе.](https://habrastorage.org/getpro/habr/upload_files/656/e56/bc4/656e56bc4a55ec4edb589f8aea6db73f.png)
Дома я открыл данный файл в звуковом редакторе Adobe Audition как 16-битные PCM данные (1 канал, моно). Если внимательно посмотреть на рис. 1, то заметно, что байты данных представлены в порядке big-endian, или смещены на один или другое нечётное количество байт. Это нужно учесть на этапе открытия файла в Adobe Audition, поставив соответствующий параметр (рис. 3).
![Рис. 3. Параметры чтения PCM данных Adobe Audition. Рис. 3. Параметры чтения PCM данных Adobe Audition.](https://habrastorage.org/getpro/habr/upload_files/787/eed/94d/787eed94d9a8b382d93ae31ba238ac57.png)
После процесса открывания файла я увидел следующую картину (рис. 4).
![Рис. 4. Вид файла кардиограммы в Adobe Audition, как PCM данные. Рис. 4. Вид файла кардиограммы в Adobe Audition, как PCM данные.](https://habrastorage.org/getpro/habr/upload_files/e9d/5da/2a5/e9d5da2a5d3947cfe183cbc0faf13705.png)
На моё удивление всё оказалось проще, чем я думал: никаких там ADPCM и прочих сжатий и шифровок. Единственное, что меня удивило – данные не нормализированы по амплитуде. На рис. 5 представлено то же самое, но с увеличенным масштабом по вертикали. Как видно, амплитуда кардиограммы составляет порядка -40 дБ. По моей оценке, учитывая бумажную распечатку и масштаб 10мм/мВ, полный уровень амплитуды сигнала 0 дБ составляет порядка 100 мВ. Также на этом же рисунке я условно пронумеровал группы данных, которые визуально различимы.
![Рис. 5. Вид с увеличенным масштабом по вертикали. Рис. 5. Вид с увеличенным масштабом по вертикали.](https://habrastorage.org/getpro/habr/upload_files/fbf/693/52a/fbf69352adbf45e9bb3debb498c780ba.png)
Группы 1-8 – это составляющие кардиограммы, как на бумаге. Группа 9 – отдельные куски кардиограммы, сразу пока не было ясно, что это. В увеличенном по горизонтали виде они показаны на рис. 6. Здесь содержится 8 разных по форме кусков кардиограмм. Форма каждого такого куска схожа с формой фрагментов основной кардиограммы на соответствующем канале. Например, форма первого куска похожа на форму фрагмента кардиограммы с 1-ого канала, и так далее, до 8. Ещё там между кусками присутствуют постоянные составляющие (DC). Сначала я думал, что это базовые стандартные формы, на которые опирается алгоритм самодиагностики. Но потом я посмотрел спектры этих фрагментов, сравнил со спектрами основных сигналов кардиограммы и пришёл к следующему выводу. Эти куски представляют собой усреднённые результирующие значения всех циклов за 10 секунд записи. Точнее говоря – фрагментов основных переходных фаз кардиограммы. Видимо, именно по этим усреднённым формам алгоритм делает основные измерения и диагностику. А постоянные составляющие – это заполнение пустоты крайними значениями семплов. Размер такого «окна» для хранения усреднённого значения циклов, видимо, фиксированный и составляет 1200 семплов (1.2 сек., 2400 байт). Видимо, предусмотрен гарантированный запас на случай более «вялых» кардиограмм.
![Рис. 6. Результирующие фрагменты кардиограммы по каждому каналу. Рис. 6. Результирующие фрагменты кардиограммы по каждому каналу.](https://habrastorage.org/getpro/habr/upload_files/7c6/dda/f6e/7c6ddaf6e0dba8e46fe06f344181a573.png)
Малая часть информации до 1-ой и после 9-ой группы не относится к данным сигнала, и я не занимался её расшифровкой. Информация до 1-ой группы – какой-то заголовок, размером 2031 байт. Байты его окончания представлены на рис. 7. Они выделены выделением HEX редактора. Подавляющее большинство байтов – нули.
Информация после 9-ой группы, как я понял, относится к информации о диагностике. На рисунке 8 представлены байты начала этого информационного блока (начиная от выделенного байта). В текстовой интерпретации некоторых байтов можно увидеть смысловые обозначения.
Опытным путём, опираясь на бумажную распечатку и масштаб по горизонтали, я установил, что частота дискретизации данных сигнала кардиограммы составляет 1 кГц. Всего записано 8 каналов, содержимое которых следует по очереди (в отличие от способа хранения PCM данных многоканального аудио). Длительность сигнала на каждом канале – 10000 семплов, или 10 секунд, как на бумажной кардиограмме. Почему на бумаге 12 отведений, а в файле, по сути, 8 – об этом я напишу позднее.
На рисунке 9 представлена таблица содержимого файла с указанием смещений и размеров блоков. Думаю, в дополнительных комментариях не нуждается. Принимая во внимание принцип однородности информации, обнаружились лишние два байта (число 0x0001), которые я назвал отступом.
![Рис. 9. Блоки информации в файле кардиограммы и их смещения. Рис. 9. Блоки информации в файле кардиограммы и их смещения.](https://habrastorage.org/getpro/habr/upload_files/396/516/019/396516019d23abfef74fdb6acfef3495.png)
Посмотрим, как выглядит спектр сигналов кардиограммы. Для корректности отображения шкалы времени и частот я открыл файл как PCM данные с нужной частотой дискретизации 1 кГц, хоть и нестандартной для звукового оборудования. При необходимости прослушивания кардиограммы нужно в Adobe Audition выполнить апсемплинг с интерполяцией. На рисунке 10 показан волновой и спектральный виды сигнала первых двух каналов. Я открыл файл в более свежей версии Adobe Audition, где есть возможность показать сразу два вида, один под другим.
![Рис. 10. Вид спектра кардиограммы 1 и 2 каналов. Рис. 10. Вид спектра кардиограммы 1 и 2 каналов.](https://habrastorage.org/getpro/habr/upload_files/5af/a8b/0d8/5afa8b0d88ae4c78fa3cf9f56c11b51a.png)
На спектре кроме полезной информации наблюдаются помехи в виде шума и тонов 150, 200 и 250 Гц. Я не знаю род этих помех, но могу лишь отметить, что самим кардиографом они не подавлены, вопреки написанной информации о фильтре на бумажной версии кардиограммы (рис. 1). Или же данный фильтр применяется на более раннем этапе обработки и преобразования, или же у него не такая резкая характеристика. В любом случае, как показала практика, данные помехи не оказывают существенного влияния на волновой вид кардиограммы, особенно на распечатке. Высокочастотные незначительные помехи, возможно, маскируются погрешностью печати. Или же фильтр применяется только к печати, а в файл записываются данные без применения фильтра. Тон 150 Гц на втором канале чуть «громче», чем на первом. Те же помехи наблюдаются на спектрах кусков (усреднений) периодов, о которых я писал выше. Именно эта особенность и помогла мне сделать более обоснованные умозаключения.
Затем стал вопрос о несоответствии количества отведений и каналов. У меня были некие предположения для объяснения этого момента. Быстренько изучив матчасть, я убедился, что мои мысли были на правильном пути. Внимательно рассматривая формы, сравнивая их с бумажным вариантом, я пришёл к выводу, что по каналам записаны отведения в следующем порядке: I, II, V1, V2, V3, V4, V5, V6. То есть, не хватает отведений III, aVR, aVL и aVF.
Шесть сигналов (I, II, III, aVR, aVL и aVF) представляются в виде векторов, как показано на рисунке 11.
![Рис. 11. Векторные представления сигналов основных отведений. Рис. 11. Векторные представления сигналов основных отведений.](https://habrastorage.org/getpro/habr/upload_files/d62/966/eab/d62966eab077e701552e19cfa3e14540.png)
Достаточно знать сигналы 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. С точки зрения математики данная кривая представляет собой график параметрической функции, которая задаётся составляющими левого и правого каналов.
![Рис. 12. Сигналы отведений aVF и I для анализа фазы. Рис. 12. Сигналы отведений aVF и I для анализа фазы.](https://habrastorage.org/getpro/habr/upload_files/98d/c6d/5d6/98dc6d5d6fe4d1511aafdf328bc0ff39.png)
![Рис. 13. Анализ фазы между сигналами отведений aVF и I. Рис. 13. Анализ фазы между сигналами отведений aVF и I.](https://habrastorage.org/getpro/habr/upload_files/e26/f2c/56d/e26f2c56d74698177113bd02404ca78b.png)
Ввиду цикличности сигнала кардиограммы фазовая кривая также циклична, и также есть небольшие разбросы и отклонения. А в целом вырисовывается определённая картина, связанная с формой кривой. Как и в случае с видом кардиограммы, на фазовой кривой также выделяются три основных участка, которые называются P, QRS и T. Это показано на рисунках 14 и 15, где фазовая кривая нарисована только для одного цикла. На рисунке 14 точками кью приблизительно помечены участки P, QRS и T. А на рисунке 15 я не стал помечать эти участки, так как мне не удаётся это сделать красиво. Самая большая фигура в виде петли, которую рисует фазовая кривая, относится к QRS участку. Участки P и T представляют собой две небольшие петли, расположенные в первой четверти системы координат, они малозаметны.
![Рис. 14. Один цикл сигналов отведений aVF и I. Рис. 14. Один цикл сигналов отведений aVF и I.](https://habrastorage.org/getpro/habr/upload_files/b89/470/ccd/b89470ccdef1926815c78d6e70b9f67f.png)
![Рис. 15. Анализ фазы между aVF и I для одного цикла. Рис. 15. Анализ фазы между aVF и I для одного цикла.](https://habrastorage.org/getpro/habr/upload_files/f2f/350/f51/f2f350f516c6b9738a8331ba8723b2ec.png)
Мне стало интересно, применяется ли подобная аналитика в медицине при диагностике в более сложных аппаратах? Можно ли по виду данной фазовой кривой судить о значении угла ЭОС? Эти вопросы уже выходят за рамки данной статьи. В Интернете я пытался найти что-либо про анализ фазы в кардиографии. Максимум, что я нашёл – применение похожего анализа фазы между сигналом одного конкретного отведения и сигналом его производной (например, I и I’) (рис. 16). Но в данном случае формы кривых, разумеется, уже совсем другие.
![Рис. 16. Применение анализа фазы в ЭКГ. Рис. 16. Применение анализа фазы в ЭКГ.](https://habrastorage.org/getpro/habr/upload_files/30e/151/280/30e1512801b40c72d4e4a88f6d943917.png)