Хабрахабр

Как звучит сердцебиение: перевод бумажной кардиограммы в WAV-формат


Многим неоднократно приходилось сталкиваться с обследованием сердца в медицинских учреждениях с помощью кардиографа. Данный аппарат измеряет биоэлектрическую активность сердца, регистрируя результат на бумажной ленте. Современные кардиографы записывают результат измерения не на бумагу, а в цифровую память. Однако в качестве конечного носителя записанной информации зачастую применятся бумажная лента. Визуально она представляет собой длинную миллиметровую бумагу небольшой ширины, которая скручена в рулон. На бумаге, помимо миллиметровой сетки, нарисован во всю длину некий график, который отражает закон изменения измеряемой величины во времени. Измеряемая величина, как я понимаю, это есть разность потенциалов между отведениями. Чаще всего на одной ленте представлено сразу несколько графиков, так как регистрируются разности потенциалов между множеством отведений. Однако, не вдаваясь в подробности медицины, в дальнейшем будем рассматривать один из первых основных графиков. Кроме графиков, на ленте имеется дополнительная текстовая информация: масштаб по горизонтали (мм/сек), по вертикали (мм/мВ), измеренная частота сердцебиения (уд/мин) и прочее.

Фактически это низкие частоты, включая инфразвук, который, как считается, не слышен. Возникла идея преобразовать данный график в звуковой формат, воспроизвести результат и послушать, как это будет звучать.
По предварительному анализу можно сделать вывод, что частотный состав такой волны не очень насыщенный. На самом же деле, ввиду наличия емкостных дифференцирующих цепей на пути распространения сигнала от звуковой карты ПК до НЧ усилителя, колебания динамической головки не будут в точности повторять колебания, представленные на кардиограмме. Однако можно будет увидеть, как диффузор НЧ динамика будет повторять колебания, похожие на «колебания» сердца. Кроме того, будут присутствовать нелинейные искажения, сопровождающиеся кратными гармониками верхних частот. И это при условии, что нигде не установлены фильтры, срезающие сверхнизкие частоты. Тем не менее, не принимая во внимание вышеизложенный анализ, поставим задачу так: преобразовать график на бумаге в формат WAV, чтобы при открытии этого файла в звуковом редакторе вид волны совпадал с бумажным вариантом и, кроме того, чтобы соответствовал временной масштаб.

Я рассматриваю один из стандартных: 8 или 16 бит. Для начала надо прикинуть глубину квантования (разрешающая способность цифрового аудио по вертикали). Это очень много, и смысла в этом нет. Второй вариант (16 бит) – это 65536 сэмплов по вертикали, что будет соответствовать 65536 пикселей картинки, которая представляет собой скан или фотографию кардиограммы. Вот это уже более подходящий вариант. Если брать 8 бит – это 256 сэмплов, или 256 пикселей картинки. Я не знаю, какой динамический диапазон у кардиограммы, но думаю, что не больше. При этом динамический диапазон аудио составит 6*8=48 дБ. Кстати, насчёт последнего. У самого аппарата он естественно больше, но погрешность неизбежна при выводе кардиограммы на бумагу, особенно если речь идёт о прямой прорисовке пером. Миллиметровая бумажная лента для таких кардиограмм специфическая: по вертикали вместо прямых линий нанесены дуги окружностей. Я не буду брать во внимание старые образцы, которые нарисованы «радиальным» пером. От этого параметра будет зависеть скорость воспроизведения, и она должна соответствовать реальной «скорости кардиограммы». Что касается масштаба по горизонтали – частота дискретизации – будет рассчитываться исходя из масштаба кардиограммы и размера изображения.

Затем нужно изменить размер изображения таким образом, чтобы требуемая кардиограмма вписывалась в полосу шириной 256 пикселей. Бумагу с кардиограммой следует отсканировать в ч/б виде с оттенками серого в достаточном разрешении. В качестве примера рассмотрим два из них. Я нашёл в Интернете множество изображений с кардиограммами.

Высота изображения – 431. Первое изображение, можно сказать, уже почти подготовленное. Волна по ширине полностью заполняет весь рисунок. Ширина – 1023. А вот по высоте нужно оставить 256, обрезав изображение сверху и снизу так, чтобы волна располагалась приблизительно по центру.

Возьмём самую первую. На втором рисунке изображено сразу несколько кардиограмм. После обрезки получилась картинка размерами 508 на 61.

Волна также должна располагаться приблизительно по центру. Не растягивая изображение по вертикали, сделаем картинку по высоте 256, заполнив созданную область белой пустотой. Ширину 508 при вырезании я выбрал так, чтобы оставить как можно большее число целых миллиметровых клеток, которые также видны на изображении.

Это делается элементарно. Оба изображения нужно преобразовать к такому виду, при котором будет виден только чёрный график на белом фоне и больше ничего. Если не получается идеального преобразования, лишний оставшийся «мусор» над графиком необходимо стереть инструментом «ластик». Ввиду того, что график нарисован намного жирнее, чем миллиметровая сетка, в графическом редакторе с помощью регулировок «яркость, контрастность, насыщенность» можно добиться требуемого результата. Таким образом, в картинке уже точно останутся только белые и чёрные цвета. Все изображения требуется сохранить в формат монохромного BMP.

Получившиеся картинки необходимо повернуть на 90 градусов против часовой стрелки (ширина и высота изображения при этом поменяются местами). Прежде приступить к описанию алгоритма преобразования картинки в WAV, стоит оговорить некоторые нюансы, которые упростят программирование. Известно, что цветовые данные каждого пикселя BMP файла записываются в файл по порядку построчно, начиная с нижнего левого угла. Это нужно для того, чтобы сориентировать начало кардиограммы с началом BMP файла. Конечно же, произойдёт «переопределение информации», но зато при таком формате каждый пиксель изображения соответствует одному байту, что очень удобно при программировании. Затем картинки необходимо открыть в редакторе «MS Paint» (у меня Windows XP) и выполнить сохранение в 8-битный BMP (256 цветов). В результате должно получиться примерно следующее (здесь две картинки соединены и уменьшены вдвое). Байт «0» — пиксель чёрного цвета, а байт «255» — белого.

Это также упрощает программирование, ибо при выводе в WAV необходимо ещё позаботиться о 44-байтном заголовке. Что касается выходного формата – будем выводить не в стандартный WAV файл, а в файл RAW-данных (PCM). 5» PCM файл открывается без проблем. В распространённом звуковом редакторе «Adobe Audition 1. Как ни странно, но такие файлы Adobe Audition также открывает. Более того, можно даже выводить в текстовый файл десятичные числа PCM данных в столбик, предварительно сформировав специфический текстовый заголовок.

А алгоритм очень простой: нужно проанализировать каждую строчку BMP файла снизу вверх. Опишем алгоритм преобразования. Полученные целочисленные неотрицательные значения нужно записать в выходной PCM файл в бинарном виде. Анализ будет заключаться в подсчёте слева направо идущих подряд белых пикселей, пока не встретится чёрный. Глубина квантования 8 бит PCM формата аудиоданных подразумевает кодировку сэмплов по такому же принципу. Размер выходного файла будет в точности совпадать с высотой обрабатываемого изображения. К примеру, файл PCM аудио данных тишины будет содержать одинаковые байты значением «128». Значение «0» — максимальное отрицательное значения сэмпла аудио, значение «255» — максимальное положительное, а «128» — нулевое значение (посередине). Но описанный алгоритм «ловит» верхнюю огибающую, чего вполне будет достаточно. Стоит оговорить, что в строчке может встретиться несколько подряд идущих чёрных пикселей, в зависимости от толщины линии кардиограммы. Тем более, острые пики кардиограммы, направленные вверх, лучше будут схватываться этим способом.

Программа, написанная на Си, весьма простая и в подробных комментариях не нуждается. Теперь можно приступить к написанию текста программы.

#include <stdio.h> //Нужная библиотека, как обычно; int main()while(px); //И так, пока не встретится чёрный пиксель; fwrite(&s,1,1,out); //Записываем получившийся результат в выходной файл; } fclose(in); //Закрываем входной файл; fclose(out); //Закрываем выходной файл; return 0; //Типа конец программы;
}

При попытке открытия файла в Adobe Audition должно всплыть следующее окно. После выполнения программы над файлом «1.bmp» будет создан файл «1.pcm» в том же каталоге с программой.

Последний параметр написан на кардиограмме. Необходимо выбрать «Моно», «8-бит», а частоту дискретизации в поле ввода напечатать исходя из расчёта: f=h/(s/v), где h – высота рисунка (оно же и число сэмплов в аудио), s – длинна кардиограммы в миллиметрах, v – масштаб кардиограммы в мм/сек. Расчёты частот дискретизации в Excel для наших примеров продемонстрированы на рисунке ниже. На первой кардиограмме ничего не написано, но масштаб, как правило, часто составляет 25 мм/сек.

Можно вводить даже десятичные доли, всё равно потом произойдёт автоматическое округление до целого. Как сказано выше, вводим в соответствующее поле необходимые значения частот дискретизации для каждого из примеров.

Заметим, что данный вид будет представлен «вверх ногами», и для полного соответствия с бумажным вариантом следует выполнить инвертирование волны в соответствующем меню. При нажатии «OK» соглашаемся с тем, что работаем с «Unsigned 8 bit» сэмплами (будет ещё одно окошко), после чего в основном поле звукового редактора развернётся вид волны нашего файла. В результате это будет выглядеть так.

Вторая кардиограмма выглядит «потише», так как она изначально была не очень большая по размеру.

Для того чтобы корректно воспроизвести файл, необходимо выполнить функцию «Конвертировать тип сэмпла». К сожалению, не все звуковые карты позволяют воспроизводить аудио на произвольной частоте дискретизации, точнее, подавляющее большинство вовсе не умеет. Последнее необходимо для точности на этапе интерполяции при апсэмплинге. Будем преобразовывать к ближайшему стандартному значению 8000 Гц, заодно увеличим разрешающую способность по амплитуде до 16 бит. Кстати говоря, данную процедуру можно было выполнить программно на этапе преобразования BMP-PCM, даже с применением интерполяции. Если оставить 8 бит, то оставшаяся область спектра будет заполнена шумом квантования. Но одна из целей являлась простота программного кода.

Можно сохранить результат в стандартный wav или mp3 файл. После операции апсэмплинга можно прослушивать и наслаждаться результатом. Ниже представлено видео, звуковой дорожкой которого (после монтажа) как раз и являются те самые аудио, которые были получены из бумажной кардиограммы. Звучит ровно так же, как я и предполагал изначально. Видео хотелось сделать как можно быстрее. Сразу приношу извинение за качество видео и за мерцание, но у меня при текущих условиях не было экранного рекордера и нормального дисплея.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть