Изучение структуры файла с цифрового кардиографа, извлечение и анализ данных кардиограммы

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Четыре года назад я уже писал статью на тему обработки кардиограммы. Тогда я показал, как можно перевести бумажную кардиограмму в цифровой формат PCM данных, отрыв затем её в звуковом редакторе. Мне было интересно воспроизвести, послушать и оценить, как это будет звучать. В этот раз предстоит не менее интересная задача. Необходимо разобраться в структуре файла кардиограммы, переписанного с цифрового кардиографа, и извлечь из него всю информацию о кардиограмме в понятном для пользователя виде.

Когда я в поликлинике делал кардиограмму, кроме распечатки я попросил переписать данные с результатом исследования на флешку непосредственно с аппарата. Информация содержится в одном файле с расширением «dat». Разумеется, это не графическая информация (не картинка), как многие могли бы подумать. Имя файла состоит из даты, времени и порядкового номера пациента. Размер файла – 180 кБ. Подразумевается, что для просмотра кардиограммы файл нужно открыть в программе, прилагаемой с кардиографом.

На бумаге кардиограмма выглядит следующим образом.

Рис. 1. Кардиограмма на бумаге.
Рис. 1. Кардиограмма на бумаге.

Ещё справа там была написана аналитическая и диагностическая информация, но я это решил не вставлять в рисунок, так как данная информация не в тему. Внизу написана информация об основных параметрах кардиограммы. Фильтр – 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 редакторе.

Дома я открыл данный файл в звуковом редакторе Adobe Audition как 16-битные PCM данные (1 канал, моно). Если внимательно посмотреть на рис. 1, то заметно, что байты данных представлены в порядке big-endian, или смещены на один или другое нечётное количество байт. Это нужно учесть на этапе открытия файла в Adobe Audition, поставив соответствующий параметр (рис. 3).

Рис. 3. Параметры чтения PCM данных Adobe Audition.
Рис. 3. Параметры чтения PCM данных Adobe Audition.

После процесса открывания файла я увидел следующую картину (рис. 4).

Рис. 4. Вид файла кардиограммы в Adobe Audition, как PCM данные.
Рис. 4. Вид файла кардиограммы в Adobe Audition, как PCM данные.

На моё удивление всё оказалось проще, чем я думал: никаких там ADPCM и прочих сжатий и шифровок. Единственное, что меня удивило – данные не нормализированы по амплитуде. На рис. 5 представлено то же самое, но с увеличенным масштабом по вертикали. Как видно, амплитуда кардиограммы составляет порядка -40 дБ. По моей оценке, учитывая бумажную распечатку и масштаб 10мм/мВ, полный уровень амплитуды сигнала 0 дБ составляет порядка 100 мВ. Также на этом же рисунке я условно пронумеровал группы данных, которые визуально различимы.

Рис. 5. Вид с увеличенным масштабом по вертикали.
Рис. 5. Вид с увеличенным масштабом по вертикали.

Группы 1-8 – это составляющие кардиограммы, как на бумаге. Группа 9 – отдельные куски кардиограммы, сразу пока не было ясно, что это. В увеличенном по горизонтали виде они показаны на рис. 6. Здесь содержится 8 разных по форме кусков кардиограмм. Форма каждого такого куска схожа с формой фрагментов основной кардиограммы на соответствующем канале. Например, форма первого куска похожа на форму фрагмента кардиограммы с 1-ого канала, и так далее, до 8. Ещё там между кусками присутствуют постоянные составляющие (DC). Сначала я думал, что это базовые стандартные формы, на которые опирается алгоритм самодиагностики. Но потом я посмотрел спектры этих фрагментов, сравнил со спектрами основных сигналов кардиограммы и пришёл к следующему выводу. Эти куски представляют собой усреднённые результирующие значения всех циклов за 10 секунд записи. Точнее говоря – фрагментов основных переходных фаз кардиограммы. Видимо, именно по этим усреднённым формам алгоритм делает основные измерения и диагностику. А постоянные составляющие – это заполнение пустоты крайними значениями семплов. Размер такого «окна» для хранения усреднённого значения циклов, видимо, фиксированный и составляет 1200 семплов (1.2 сек., 2400 байт). Видимо, предусмотрен гарантированный запас на случай более «вялых» кардиограмм.

Рис. 6. Результирующие фрагменты кардиограммы по каждому каналу.
Рис. 6. Результирующие фрагменты кардиограммы по каждому каналу.

Малая часть информации до 1-ой и после 9-ой группы не относится к данным сигнала, и я не занимался её расшифровкой. Информация до 1-ой группы – какой-то заголовок, размером 2031 байт. Байты его окончания представлены на рис. 7. Они выделены выделением HEX редактора. Подавляющее большинство байтов – нули.

Рис. 7. Байты заголовка в файле кардиограммы.
Рис. 7. Байты заголовка в файле кардиограммы.

Информация после 9-ой группы, как я понял, относится к информации о диагностике. На рисунке 8 представлены байты начала этого информационного блока (начиная от выделенного байта). В текстовой интерпретации некоторых байтов можно увидеть смысловые обозначения.

Рис. 8. Байты диагностической информации в файле кардиограммы.
Рис. 8. Байты диагностической информации в файле кардиограммы.

Опытным путём, опираясь на бумажную распечатку и масштаб по горизонтали, я установил, что частота дискретизации данных сигнала кардиограммы составляет 1 кГц. Всего записано 8 каналов, содержимое которых следует по очереди (в отличие от способа хранения PCM данных многоканального аудио). Длительность сигнала на каждом канале – 10000 семплов, или 10 секунд, как на бумажной кардиограмме. Почему на бумаге 12 отведений, а в файле, по сути, 8 – об этом я напишу позднее.

На рисунке 9 представлена таблица содержимого файла с указанием смещений и размеров блоков. Думаю, в дополнительных комментариях не нуждается. Принимая во внимание принцип однородности информации, обнаружились лишние два байта (число 0x0001), которые я назвал отступом.

Рис. 9. Блоки информации в файле кардиограммы и их смещения.
Рис. 9. Блоки информации в файле кардиограммы и их смещения.

Посмотрим, как выглядит спектр сигналов кардиограммы. Для корректности отображения шкалы времени и частот я открыл файл как PCM данные с нужной частотой дискретизации 1 кГц, хоть и нестандартной для звукового оборудования. При необходимости прослушивания кардиограммы нужно в Adobe Audition выполнить апсемплинг с интерполяцией. На рисунке 10 показан волновой и спектральный виды сигнала первых двух каналов. Я открыл файл в более свежей версии Adobe Audition, где есть возможность показать сразу два вида, один под другим.

Рис. 10. Вид спектра кардиограммы 1 и 2 каналов.
Рис. 10. Вид спектра кардиограммы 1 и 2 каналов.

На спектре кроме полезной информации наблюдаются помехи в виде шума и тонов 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. Векторные представления сигналов основных отведений.

Достаточно знать сигналы 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 для анализа фазы.
Рис. 13. Анализ фазы между сигналами отведений aVF и I.
Рис. 13. Анализ фазы между сигналами отведений aVF и I.

Ввиду цикличности сигнала кардиограммы фазовая кривая также циклична, и также есть небольшие разбросы и отклонения. А в целом вырисовывается определённая картина, связанная с формой кривой. Как и в случае с видом кардиограммы, на фазовой кривой также выделяются три основных участка, которые называются P, QRS и T. Это показано на рисунках 14 и 15, где фазовая кривая нарисована только для одного цикла. На рисунке 14 точками кью приблизительно помечены участки P, QRS и T. А на рисунке 15 я не стал помечать эти участки, так как мне не удаётся это сделать красиво. Самая большая фигура в виде петли, которую рисует фазовая кривая, относится к QRS участку. Участки P и T представляют собой две небольшие петли, расположенные в первой четверти системы координат, они малозаметны.

Рис. 14. Один цикл сигналов отведений aVF и I.
Рис. 14. Один цикл сигналов отведений aVF и I.
Рис. 15. Анализ фазы между aVF и I для одного цикла.
Рис. 15. Анализ фазы между aVF и I для одного цикла.

Мне стало интересно, применяется ли подобная аналитика в медицине при диагностике в более сложных аппаратах? Можно ли по виду данной фазовой кривой судить о значении угла ЭОС? Эти вопросы уже выходят за рамки данной статьи. В Интернете я пытался найти что-либо про анализ фазы в кардиографии. Максимум, что я нашёл – применение похожего анализа фазы между сигналом одного конкретного отведения и сигналом его производной (например, I и I’) (рис. 16). Но в данном случае формы кривых, разумеется, уже совсем другие.

Рис. 16. Применение анализа фазы в ЭКГ.
Рис. 16. Применение анализа фазы в ЭКГ.

Источник: https://habr.com/ru/post/663608/


Интересные статьи

Интересные статьи

В VBR 11 у инструментов Veeam Explorer for SQL Server и Veeam Explorer for Oracle появилась возможность мгновенного восстановления базы данных  (Instant recovery). П...
Поговорим о методах 3D восстановления лица человека, которое почти не отличить от фотографий. Тема лицевой 3D реконструкции вот уже 2 года практически не освещается на ха...
Оптический кабель Marea Межконтинентальный подводный кабель связи Marea — один из самых быстрых на сегодняшний день — установил новый рекорд. Скорость передачи данных по оптоволокну, п...
На дворе 2020 год и фоновым шумом вы уже привыкли слышать: «Кубернетес — это ответ!», «Микросервисы!», «Сервис меш!», «Сесурити полиси!». Все вокруг бегут в светлое будущее. Подход...
Добрый день, сегодня я хотел бы поделится с Вами проблемами и их необычными решениями, которые встретились при написании небольших IT проектов. Сразу скажу, что статья для тех, кто хоть немного р...