Введение
При обработке медицинских данных требуется определять частоту сердечных сокращений (ЧСС). Большинство методик расчёта ЧСС использует определение пиков в графике сердечных сокращений и подсчёта длительности интервала между пиками. Альтернативным методом расчёта ЧСС является вычисление корреляции последовательности измерений относительно сдвига графика на заданный интервал времении и выбор в качестве вычисленного интервала того, при котором корреляция максимальная. Недостатком вычисления интервала сердечных сокращений методом расчёта корреляции является большое число вычислений, однако число этих расчётов можно существенно сократить при использовании быстрых Фурье преобразований (БФП).
Описание метода определения частоты сердечных сокращений
Путь x(i) - последовательность измерений сердечных сокращений полученные с частотой дискретизации frequency (Гц).
Предварительная обработка сигнала
Обработаем последовательность x фильтром двойного дифференцирования, то есть вычислим f(t)=x(t)-2*x(t-1)+x(t-2).
Как указано в работе (Котов Максим Дмитриевич. Алгоритм подсчета ЧСС на основе данных ЭКГ, полученных бесконтактно. Бакалаврская работа. 2015) при данной предварительной фильтрации наиболее качественно детектируется длительнось интервала сердечных сокращений.
Вычисление длительности интервала сердечных сокращений
Для вычисления ЧСС на заданный момент t требуется выбрать длительность окна данных, на котором производится определение интервала частоты сердечных сокращений. Пусть длительность этого интервала определена переменной delay (сек) и эта величина выбирается порядка ~3 сек исходя из диапазона ЧСС в 40-200 ударов/мин. Тогда нам понадобится выделить из исходной последовательности N = ЦЕЛОЕ(delay*frequency) измерений на момент t.
Подготовим массив длины 2N F(i) = { f(t-(N-1)+i) при 0<=i<N и 0 при N<=i<2N }
Вычислим массив S(k) = SUM F(i)*F((i+k) mod 2N) для i=0,2N-1
Для вычисления массива S применяем алгоритм с использованием БФП
Вычисляем массив V = FFT(F), где FFT - прямое Фурье-преобразование
Вычисляем массив M2(i) = {|V(i)|^2}
Вычисляем массив S = BFT(M2), где BFT - обратное Фурье-преобразование
Вычислим массив корреляций P(k) = S(k) /(1+|N-k|)
В массиве P(k), для индексов в диапазоне [60/200*frequency;MIN(N,60/40*frequency)] найдём индекс index с максимальным значением P(index).
Тогда длительность интервала сердечных сокращений в момент t равна index/frequency (сек), а частота сердечных сокращений, соответственно, равна 60*frequency/index (ударов/мин).
Примечания
Коэффициент 1/(1+|N-k|) при вычислении P(k) выбран поскольку в сумме SUM F(i)*F((i+k) mod 2N) участвует не более |N-k| ненулевых слагаемых.
При вычислении Фурье-преобразований можно не заботится об умножении на поправочный коэффициент, поскольку алгоритм предполагает выбор максимального значения из массива P.
Теоретические основы метода
Корреляция двух функций
Согласно определению, корреляцией (F,G) двух функций F и G называется величина:
(F,G) = SUM F(i)*G(i)
Свёртка двух функций
Согласно определению, свёрткой двух функций F и G называется функция FхG:
FхG(t) = SUM F(i)*G(j)|i+j=t
Дискретное преобразование Фурье
Дискретное преобразование Фурье (в англоязычной литературе DFT, Discrete Fourier Transform) — это одно из преобразований Фурье, широко применяемых в алгоритмах цифровой обработки сигналов (его модификации применяются в сжатии звука в MP3, сжатии изображений в JPEG и др.), а также в других областях, связанных с анализом частот в дискретном (к примеру, оцифрованном аналоговом) сигнале. Дискретное преобразование Фурье требует в качестве входа дискретную функцию. Такие функции часто создаются путём дискретизации (выборки значений из непрерывных функций). Дискретные преобразования Фурье помогают решать дифференциальные уравнения в частных производных и выполнять такие операции, как свёртки. Дискретные преобразования Фурье также активно используются в статистике, при анализе временных рядов. Существуют многомерные дискретные преобразования Фурье.
Фурье-преобразования для вычисления свёртки
Одним из замечательных свойств преобразований Фурье является возможность быстрого вычисления корреляции двух функций определённых, либо на действительном аргументе (при использовании классической формулы), либо на конечном кольце (при использовании дискретных преобразований).
И хотя подобные свойства присущи многим линейным преобразованиям, для практического применения, для вычисления операции свёртки, согласно данному нами определению, используется формула
FхG = BFT ( FFT(F)*FFT(G) )
Где
FFT – операция прямого преобразования Фурье
BFT – операция обратного преобразования Фурье
Проверить правильность равенства довольно легко – явно подставив в формулы Фурье-преобразований и сократив получившиеся формулы
Фурье-преобразования для вычисления корреляции
Пусть (F,G)(t) равна корреляции получаемой в результате сдвига одного вектора, относительно другого на шаг t
Тогда, как уже показано ранее, выполняется
(F,G)(t) = FхG’(t) = BFT ( FFT(F)*FFT(G’) )
Если используются реализации алгоритма трансформации Фурье через комплексные числа, то такие преобразования обладают ещё одним замечательным свойством:
FFT(G’) = CONJUGATE ( FFT(G) )
Где
CONJUGATE ( FFT(G) ) – матрица, составленная из сопряжённых элементов матрицы FFT(G)
Таким образом, получаем
(F,G)(t) = BFT ( FFT(F)*CONJUGATE ( FFT(G) ))
Фурье-преобразования для вычисления корреляции функции с собой
Из ранее полученного имеем
(F,F)(t) = FхF’(t) = BFT ( FFT(F)*FFT(F’) )
FFT(F') = CONJUGATE ( FFT(F) )
Таким образом, если
V = FFT( F ) и
M2 = V*CONJUGATE(V) = {|V(i)|^2},
то
(F,F)(t) = BFF ( V*CONJUGATE(V) ) = BFT ( M2 )
Пример реализации
Реализован пример обработки файла в формате EDF, содержащего канал EKG с данными измерений сердечных сокращений https://github.com/dprotopopov/HeartRate.
Частота сердечных сокращений рассчитывается консольной программой с заданной частотой на основе измерений, содержащихся в EDF файле.
Результаты сравнивались с результатами в других программах обработки медицинских данных.
Используемая литература
Используемое программное обеспечение
Microsoft Visual Studio 2019 C# - среда и язык программирования
Math.Net – библиотека реализующая алгоритмы быстрого дискретного преобразования Фурье
Комментарии (15)
REPISOT
24.12.2021 14:55+1Недостатком вычисления интервала сердечных сокращений методом рассчёта корреляции является большое число вычислений, однако число этих расчётов можно существенно сократить при использовании быстрых Фурье преобразований (БФП).
А этот тезис, на решение которого направлена статья, так нигде и не подтвержден. Где сравнение быстродействия или используемой памяти? Есть ли реально проблема вычисления корреляции?
P.S.
В бытность студентом один сокурсник делал такой пульсометр: усилитель, компаратор, микроконтроллер с таймером по прерыванию. Мерил по пикам. Никаких 30 секунд не надо, обновлялся в зависимости от усреднения (а так мог на каждый удар выдавать частоту).dprotopopov Автор
24.12.2021 15:03-1Для расчёта массива корреляций размера N "в лоб" требуется O(N^3) операций, при использовании БФП оценка O(NlogN)
pulsework
24.12.2021 15:09ну есть еще быстрые алгоритмы свертки без бпф,, ну и при каком-то N эффективнее прямая свертка, при каком-то N (большом) БПФ будет эффективнее. И обработка по типу коррелляции самого с собой автоматиччески ухудшает помехозащищенность на 6 дб. Автору надо прочитать про согласованную фильтрацию КИХ фильром через БПФ - но это уже будет не диплом, дисер !
dprotopopov Автор
24.12.2021 15:21-1при частоте дискретизации 250 Гц и времени измерения ~3сек размеры массивов составляют от 3*250 = 750 элементов. это как минимум 750^3 элементарных операций при вычислении "в лоб".
dprotopopov Автор
24.12.2021 18:20+1Поторопился ответить и ошибся - при вычислении "в лоб" требуется от 750^2 элементарных операций
qbertych
24.12.2021 15:54+6Вау, просто вау. Изящные и всем понятные математические функции SUM F(i)*G(i) и ЦЕЛОЕ(delay*frequency). Обработка медицинских (!) данных, обоснованная ссылкой на бакалаврскую работу. Никаких попыток показать, что это работает на реальных данных. И все это написано таким жутчайшим канцеляритом, что просто кровь из глаз.
Если это курсовая, то пожалуйста, не ставьте за это зачет. Такое нельзя ни выпускать наружу, ни тем более подпускать к медицинским данным.
Armleo
24.12.2021 16:47+2Откуда, такие писатели находятся? Технический уровень материала на уровне нуля, статья в потоке разработки, при этом какое-то говно. Если пишите, хотя бы делайте это нормально. У вас 9 статьей, все они пустышки, без сути, смысла, понятного объяснения или хотя бы для вида - кода. Зачем так писать?
michael108
24.12.2021 23:10+1Вообще-то, имхо, лучше все-таки мерять R-R интервалы — так и мгновенную частоту можно определить, и медленные волны увидеть.
Правда, это более детальный анализ, чем просто определение средней ЧСС.dprotopopov Автор
24.12.2021 23:33Согласен с вами, что для детального анализа лучше определять пики и, соответствено, R-R интервалы, поскольку по форме графика анализируют и другие показатели сердечной деятельности. Данный метод решает определение только одного параметра - ЧСС.
DistortNeo
25.12.2021 15:49+1Верно. Вариабельность сердечного ритма — важнейшая характеристика.
Мне не очень понятно, каково потенциальное применение алгоритма? Если данные имеют высокое качество, анализ R-R интервалов будет и более простым, и более точным.
Если же данные плохого качества (например, данные с фитнесс-трекеров), то что-либо надёжное можно сказать только на основе анализа интервала 30-60 секунд, и не факт, что Фурье сильно поможет (вариабельность ритма смажет пик).
AntonSor
Спасибо, очень интересно! Действительно, если считать по пикам, можно и пропустить нужный, и надо набрать не менее 30 секунд, чтобы получить результат. А тут можно будет брать 3-4 периода и нормально.
И аналогично можно будет определять частоту дыхания
pulsework
откуда сведения что надо именно 30 сек и откуда сведения что можно будет брать 3-4 перида?
AntonSor
Врачи измеряют именно так - подсчитывают количество ударов за 30 секунд. Я так понимаю, это описано в какой-то медицинской методичке.
3-4 периода - это я приблизительно, на глаз прикинул, для файла со 100 отсчетами в секунду, для того, чтобы получить измерение с точностью лучше, чем 2 удара в минуту (лучше 5% при 60 ударах в минуту).
А хотя тут 250 отсчетов в секунду