Обнаружение узоров в волнах

Я пытаюсь прочитать изображение из электрокардиографии и определить каждую из них (P-волна, QRS-комплекс и T-волна). Теперь я могу прочитать изображение и получить такой вектор, как (4.2; 4.4; 4.9; 4.7;...), представляющий значения в электрокардиографии, что составляет половину проблемы. Мне нужен алгоритм, который может пройти через этот вектор и определить, когда каждая из этих волн начинается и заканчивается.

Вот пример одного из его графиков:

alt text

Было бы легко, если бы они всегда имели одинаковый размер, но это не так, как будто это работает, или если бы я знал, сколько волн будет иметь ecg, но это тоже может измениться. У кого-нибудь есть идеи?

Спасибо!

Обновление

Пример того, чего я пытаюсь достичь:

Учитывая волну

alt text

Я могу извлечь вектор

[0; 0; 20; 20; 20; 19; 18; 17; 17; 17; 17; 17; 16; 16; 16; 16; 16; 16; 16; 17; 17; 18; 19; 20; 21; 22; 23; 23; 23; 25; 25; 23; 22; 20; 19; 17; 16; 16; 14; 13; 14; 13; 13; 12; 12; 12; 12; 12; 11; 11; 10; 12; 16; 22; 31; 38; 45; 51; 47; 41; 33; 26; 21; 17; 17; 16; 16; 15; 16; 17; 17; 18; 18; 17; 18; 18; 18; 18; 18; 18; 18; 17; 17; 18; 19; 18; 18; 19; 19; 19; 19; 20; 20; 19; 20; 22; 24; 24; 25; 26; 27; 28; 29; 30; 31; 31; 31; 32; 32; 32; 31; 29; 28; 26; 24; 22; 20; 20; 19; 18; 18; 17; 17; 16; 16; 15; 15; 16; 15; 15; 15; 15; 15; 15; 15; 15; 15; 14; 15; 16; 16; 16; 16; 16; 16; 16; 16; 16; 15; 16; 15; 15; 15; 16; 16; 16; 16; 16; 16; 16; 16; 15; 16; 16; 16; 16; 16; 15; 15; 15; 15; 15; 16; 16; 17; 18; 18; 19; 19; 19; 20; 21; 22; 22; 22; 22; 21; 20; 18; 17; 17; 15; 15; 14; 14; 13; 13; 14; 13; 13; 13; 12; 12; 12; 12; 13; 18; 23; 30; 38; 47; 51; 44; 39; 31; 24; 18; 16; 15; 15; 15; 15; 15; 15; 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;]

Я хотел бы обнаружить, например

P-волна в [19 - 37]

QRS-комплекс в [51 - 64]

и т.д...

Ответ 1

Первое, что я сделал бы, это посмотреть, что уже там. Действительно, эта конкретная проблема уже в значительной степени исследована. Вот краткий обзор некоторых действительно простых методов: ссылка.

Я должен ответить на другой ответ. Я занимаюсь исследованиями в обработке сигналов и поиске музыки. На первый взгляд эта проблема кажется похожей на обнаружение начала, но контекст проблемы не одинаков. Этот тип обработки биологических сигналов, то есть обнаружение P, QRS и T-фаз, может использовать знание конкретных характеристик во временной области каждого из этих сигналов. Обнаружение начала в MIR на самом деле не работает. (Не надежно, по крайней мере.)

Один из подходов, который будет хорошо работать для обнаружения QRS (но не обязательно для обнаружения начала записи), - это динамическое изменение времени. Когда характеристики во временной области остаются инвариантными, DTW может работать замечательно хорошо. Вот краткий документ IEEE, в котором используется DTW для этой проблемы: ссылка.

Это хорошая статья журнала IEEE, в которой сравниваются многие методы: ссылка. Вы увидите, что многие обычные модели обработки сигналов были опробованы. Снимите бумагу и попробуйте понять ее на базовом уровне.

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

EDIT: я попытаюсь дать простое решение, когда я получу шанс, но причина, по которой я думаю, что вейвлеты подходят здесь, - это то, что они полезны при параметризации большого разнообразия форм независимо от масштабирования по времени или амплитуде. Другими словами, если у вас есть сигнал с той же повторяющейся временной формой, но в разном масштабе времени и амплитудах, вейвлет-анализ все еще может распознавать эти формы как похожие (грубо говоря). Также обратите внимание, что я являюсь своего рода банками фильтров фильтров в эту категорию. Аналогичные вещи.

Ответ 2

Часть этой головоломки " обнаружение начала", и для решения этой проблемы был написан ряд сложных алгоритмов. Вот более подробная информация о onsets.

Следующий фрагмент - Расстояние Хэмминга. Эти алгоритмы позволяют выполнять нечеткие сравнения, входные данные - 2 массива, а выход - целое "расстояние" или разность между двумя наборами данных. Чем меньше число, тем больше похожее. Это очень близко к тому, что вам нужно, но это не точно. Я пошел вперед и внес некоторые изменения в алгоритм Хэмминга Дистрибьютора, чтобы вычислить новое расстояние, вероятно, оно имеет имя, но я не знаю, что это такое. В основном это добавляет абсолютное расстояние между каждым элементом массива и возвращает итоговое значение. Вот код для него в python.

import math

def absolute_distance(a1, a2, length):
       total_distance=0
       for x in range(0,length):
               total_distance+=math.fabs(a1[x]-a2[x])
       return total_distance

print(absolute_distance([1,3,9,10],[1,3,8,11],4))

Этот script выдает 2, что является расстоянием между этими двумя массивами.

Теперь для сборки этих произведений. Вы можете использовать обнаружение начала, чтобы найти начало всех волн в наборе данных. Затем вы можете зацикливаться на этом местоположении, сравнивая каждую волну с образцом P-Wave. Если вы нажмете QRS Complex, расстояние будет самым большим. Если вы нажмете еще одну P-Wave, число не будет равным нулю, но оно будет намного меньше. Расстояние между любой P-Wave и любой T-Wave будет довольно маленьким, ОДНАКО, это не проблема, если вы сделаете следующее предположение:

The distance between any p-wave and any other p-wave will be smaller than the distance between any p-wave and any t-wave.

Серия выглядит примерно так: pQtpQtpQt... Р-волна и t-волна находятся рядом друг с другом, но поскольку эта последовательность предсказуема, ее будет легче читать.

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

Возможно, возможно пожертвовать расчетными вычислениями в пользу итерации по 1 точке за раз и, таким образом, выполнить вычисления расстояния O (n), где n - количество точек на графике. Если бы у вас был список всех этих дистанционных вычислений и знал там, где 50 pQt последовательностей, то вы бы знали 50 кратчайших расстояний, которые не перекрываются, где все местоположения p-волн. Бинго! как это для простоты? Однако компромисс - это потеря эффективности из-за увеличения числа расстояний.

Ответ 3

Вы можете использовать cross-correlation. Возьмите образец модели каждого шаблона и сопоставьте их с сигналом. Вы получите пики, где корреляция высока. Я бы ожидал хороших результатов, используя эту технику, извлекающую qrs и t волны. После этого вы можете извлечь p-волны, ища пики на сигнале корреляции, который находится до qrs.

Кросс-корреляция - довольно простой в использовании алгоритм. В основном:

x is array with your signal of length Lx
y is an array containing a sample of the signal you want to recognize of length Ly
r is the resulting correlation

for (i=0; i<Lx - Ly; i++){
  r[i] = 0;
  for (j=0; j<Ly ; j++){
    r[i] += x[i+j]*y[j];
  }
}

Ищите пики в r (например, значения над порогом)

Ответ 4

Первое, что я хотел бы сделать, это упростить данные.

Вместо анализа абсолютных данных проанализируйте количество изменений от одной точки данных до следующей.

Вот быстрый один лайнер, который будет принимать ; разделенные данные как входные данные и выводит дельта этих данных.

perl -0x3b -ple'( $last, $_ ) = ( $_, $_-$last )' < test.in > test.out

Запустив его на предоставленные вами данные, это результат:

0; 0; 20; 0; 0; -1; -1; -1; 0; 0; 0; 0; -1; 0; 0; 0; 0; 0; 0; 1; 0; 1; 1; 1; 1; 1; 1; 0; 0; 2; 0; -2; -1; -2; -1; -2; -1; 0; -2; -1; 1; -1; 0; -1; 0; 0; 0; 0; -1; 0; -1; 2; 4; 6; 9; 7; 7; 6; -4; -6; -8; -7; -5; -4; 0; -1; 0; - 1; 1; 1; 0; 1; 0; -1; 1; 0; 0; 0; 0; 0; 0; -1; 0; 1; 1; 1; 0; 1; 0; 0; 0; 1; 0; -1; 1; 2; 2; 0; 1; 1; 1; 1; 1; 1; 1; 0; 0; 1; 0; 0; -1; -2; -1; -2; -2; -2; -2; 0; -1; -1; 0; -1; 0; -1; 0; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 1; 1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 1; -1; 0; 0; 1; 0; 0; 0; 0; 0; 0; 0; -1; 1; 0; 0; 0; 0; -1; 0; 0; 0; 0; 1; 0; 1; 1; 0; 1; 0; 0; 1; 1; 1; 0; 0; 0; -1; -1; -2; - 1; 0; -2; 0; -1; 0; -1; 0; 1; -1; 0; 0; -1; 0; 0; 0; 1; 5; 5; 7; 8; 9; 4; -7; -5; -8; -7; -6; -2; -1; 0; 0; 0; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; -1; 1; 0; 0; 0; 1; 0; 0; 0; 1; 0; 1; 0; 0; 0; 1; 1; 0; 2; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 0; 0; -1; -2; -2; -2; -2; -1; 0; -1; -2; -1; 0; -1; -1; 0; 1; -1; 1; 0; -1; 1; -1; 1; 0; -1; 0; 0; 0; -1; 1; 0; 0; 1; 0; -1; 0; 1; 0; 0; 1; -1; 0; -1; 1; 0; -1; 0; 0; 0; 0; 1; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 1; -1; 0; 1; 0; 0; 2; 0; 1; 0; 1; 1; 1; -1; 0; -2; 0; -1; -2; 0; -1; -1; -2; -1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 0; 0; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4; -2; -2; 0; 0; 0; -1; 1; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; 0; 0; 1; -1; 0; 1; 1; 0; 0; 0; 0; 1; 0; 1; 0; 1; 2; 1; 1; 2; 0; 1; 1; 1; 1; 0; 0; 1; 1; 0; 0; -35; 0; 0; 0;

В приведенном выше тексте появляются новые строки, которые изначально не присутствуют на выходе.


После того, как вы сделали это, тривиально найти комплекс qrs.

perl -F';' -ane'@F = map { abs($_) > 2 and $_ } @F; print join ";", @F'< test.out

;; 20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 4; 6; 9; 7; 7; 6; -4; -6; -8; -7; -5; -4;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 5; 5; 7; 8; 9; 4; -7; -5; -8; -7; -6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 35;;;

Точки данных 20 и -35 являются результатом исходных данных, начинающихся и заканчивающихся на 0.

Чтобы найти другие точки данных, вам придется полагаться на соответствие шаблонов.


Если вы посмотрите на первую p-волну, вы можете четко увидеть шаблон.

0;0;0;0;0;0;1;0;1;1;1;1;1;1;0;0;2;0;-2;-1;-2;-1;-2;-1;0;-2;-1;1;-1;0;-1;0;0;0;0;
#           \________ up _______/   \________ down _________/

Не так легко увидеть шаблон на второй p-волне. Это связано с тем, что второй распространяется дальше

0;0;0;1;0;1;1;0;1;0;0;1;1;1;0;0;0;-1;-1;-2;-1;0;-2;0;-1;0;-1;0;1;-1;0;0;-1;0;0;0;
#     \________ up _______/       \________________ down ________________/

Третья р-волна немного более неустойчива, чем две другие.

0;0;0;0;0;1;-1;0;1;0;0;2;0;1;0;1;1;1;-1;0;-2;0;-1;-2;0;-1;-1;-2;-1;0;0;0;0;0;
#                \_______ up ______/  \__________ down __________/

Вы находите t-волны аналогично p-волнам. Основное различие заключается в том, когда они происходят.


Для начала вам будет достаточно информации.

Два однострочных изображения, например, не рекомендуются для ежедневного использования.

Ответ 5

Являются ли эти два других острых пика и долины комплексами qrs?

Сверху моей головы я думаю, что вам нужно рассчитать наклон этого графика в каждой точке. Затем вам также нужно увидеть, как быстро изменяется наклон (вторая производная???). Если у вас внезапное изменение, вы знаете, что попали в какой-то резкий пик. Конечно, вы хотите ограничить обнаружение изменения, поэтому вам может понадобиться сделать что-то вроде "если наклон изменяется на X за промежуток времени T", так что вы не получите крошечные удары в графике.

Прошло некоторое время с тех пор, как я сделал математику... и это похоже на математический вопрос;) О, и я не сделал никакого анализа сигналов:).

Просто добавьте еще одну точку. Я думаю, вы также можете попробовать усреднение сигнала. Например, усреднение последних 3 или 4 точек данных. Я думаю, что вы также можете обнаружить резкие изменения.

Ответ 6

Я не эксперт в этой конкретной проблеме, но только от верхней части головы из более общих знаний: пусть скажет, что вы знаете комплекс QRS (или одну из других функций, но я буду использовать комплекс QRS для этот пример) имеет место примерно в течение некоторого фиксированного периода времени L. Интересно, можете ли вы рассматривать это как проблему классификации следующим образом:

  • Разделите свой сигнал на перекрывающиеся окна длины L. Каждое окно либо имеет, либо не имеет полного комплекса QRS.
  • Преобразование Фурье каждого окна. Вашими характеристиками являются уровень сигнала на каждой частоте.
  • Нарисуйте дерево решений, машину поддержки векторов и т.д. на некоторые аннотированные вручную данные.

Ответ 7

Один подход, который, скорее всего, даст хорошие результаты, - это подгонка кривой:

  • Разделите непрерывную волну на интервалы (возможно, лучше всего иметь интервальные границы примерно на полпути между острыми пиками комплексов qrs). Учитывайте только один интервал за раз.
  • Определите модельную функцию, которая может использоваться для аппроксимации всех возможных вариантов электрокардиографических кривых. Это не так сложно, как кажется первым. Модельную функцию можно построить как сумму трех функций с параметрами для начала (t_), амплитуды (a_) и ширины (w_) каждой волны.

       f_model(t) = a_p   *  f_p  ((t-t_p  )/w_p) + 
                    a_qrs *  f_qrs((t-t_qrs)/w_qrs) +
                    a_t   *  f_t  ((t-t_t  )/w_t)
    

    Функции f_p(t), f_qrs(t), f_t(t) - это простая функция, которая может использоваться для моделирования каждой из трех волн.

  • Используйте алгоритм подгонки (например, Levenberg-Marquardt-Algorithm http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm), чтобы определить параметры подгонки a_p, t_p, w_p, a_qrs, t_qrs, w_qrs, a_t, t_t, w_t для набора данных каждого интервала.

    Параметры t_p, t_qrs и t_p - это те, которые вас интересуют.

Ответ 8

Я знаю парень, который работал над этим полем. Здесь вы можете найти список своих публикаций. Он использует, если я правильно помню, "Скрытые марковские модели" для надежного обнаружения волн против набора обучающих наборов известных форм, но вы найдете более подробные сведения в документах.

Ответ 9

У вас уже есть ряд хороших ответов. Я просто удивлен, что никто не предложил "пакет программного обеспечения WFDB" из PhysioToolkit, в частности ecgpuwave

Ответ 10

Это замечательный вопрос! У меня есть несколько мыслей:

Dynamic Time Warping может быть интересным инструментом здесь. Вы должны установить "шаблоны" для своих трех классов, а затем с помощью DTW можно увидеть корреляцию между вашим шаблоном и "фрагментами" сигнала (разбить сигнал на, скажем, 5 секундные биты, то есть 0-5. 1-.6.2-.7...). Я работал с чем-то подобным для анализа походки с данными акселерометра, он работал достаточно хорошо.

Другим вариантом является комбинированный алгоритм обработки сигналов/машинного обучения. Разбейте свой сигнал на "куски" снова. Сделайте "шаблоны" еще раз (вам понадобится около дюжины для каждого класса), возьмите FFT каждого фрагмента/шаблона, а затем используйте Naïve Bayes Classifier (или другой классификатор ML, но NB должен его обрезать), чтобы классифицировать для каждого из трех классов. Я также пробовал это по данным походки и смог получить точность 98% и вспомнить с относительно сложными сигналами. Дайте мне знать, как это работает, это очень волнующая проблема.

Ответ 11

" Wavelet transform" может быть релевантным ключевым словом. Я когда-то присутствовал на презентации того, кто использовал эту технику для обнаружения различных фаз сердечного ритма в шумном ecg.

Что касается моего ограниченного понимания, то это похоже на преобразование Фурье, но с использованием (масштабированных) копий a в вашем случае пульсирующего импульса.

Ответ 12

Было показано, что вейвлеты являются лучшим инструментом для определения пиков в данных такого типа, где пики являются "разными размерами" - масштабирующие свойства всплесков делают его идеальным инструментом для обнаружения этого типа многомасштабного пикового обнаружения. Это похоже на нестационарный сигнал, поэтому использование ДПФ не будет правильным инструментом, как предполагали некоторые, но если это исследовательский проект, вы можете посмотреть на использование спектра сигнала (по оценкам, используя БПФ автокорреляции сигнал.)

Здесь - отличная статья, посвященная рассмотрению нескольких методов обнаружения пиков - это было бы неплохо начать.

-Paul

Ответ 13

Мой ответ на аналогичный вопрос об обнаружении паттернов в данных временных рядов находится здесь - fooobar.com/questions/83472/... - и включает код python.

Мой подход был "переключением авторегрессионной скрытой марковской модели" (google - фраза для некоторых релевантных публикаций).

Ответ 14

Я не читал друг друга полностью, но я просмотрел их, и я заметил, что никто не рекомендовал смотреть на преобразование Фурье, чтобы сегментировать эти волны.

Для меня это похоже на четкое применение Гармонический анализ в математике. Могут быть несколько тонких точек, которые могут отсутствовать.

Discrete Fourier Transform дают вам амплитуду и фазу различных синусоидальных компонентов, которые составляют ваш дискретный сигнал времени, что по существу что ваша проблема заявляет, что вы хотите найти.

Возможно, я кое-что пропустил...

Ответ 15

Во-первых, различные компоненты стандартной волны электрокардиограммы могут отсутствовать на любом заданном участке. Такой сюжет обычно ненормален и обычно указывает на какую-то проблему, но вы не можете пообещать, что они там.

Во-вторых, признание их - это такое искусство, как наука, особенно в тех случаях, когда что-то идет не так.

Моим подходом может быть попытка тренировать нейронную сеть для идентификации компонентов. Вы дадите ему предыдущие 30 секунд данных, нормализованные, так что самая низкая точка была в 0 и самая высокая точка в 1.0, и у нее было бы 11 выходов. Выходы, которые не были аномалиями, были бы взвешиванием за последние 10 секунд. 0.0 будет на -10 секунд от настоящего, и 1.0 теперь будет означать. Выходы:

  • Где началась самая последняя волна P
  • Где закончилась последняя волна P
  • Оценка аномалий последней P-волны с одним экстремальным отсутствием.
  • Где запущен самый последний комплекс QRS.
  • Где часть Q самого последнего комплекса QRS превратилась в часть R.
  • Где часть R самого последнего комплекса QRS превратилась в S-часть.
  • Где закончился последний QRS-комплекс.
  • Оценка аномалий для самого последнего комплекса QRS с одним экстремальным отсутствием.
  • Где началась последняя волна T.
  • Где закончилась последняя волна T.
  • Оценка аномалий последней волны T с одним экстремальным отсутствием.

Я мог бы дважды проверить это с некоторыми другими видами анализа, которые предложили люди, или использовать эти другие виды анализа вместе с выходом нейронной сети, чтобы дать вам ответ.

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

Ответ 16

Alaor, Это очень хороший вопрос. Вы уже думали о Neural Networks? У вас там много информации, вы можете научить их распознавать волны (тренировать их) или использовать Fuzzy Logic... Я бы пошел с помощью подхода Neural Networks.

Надеюсь, это поможет!

Ответ 17

Вы пробовали biosppy? если вы используете python, вы можете использовать его напрямую. Если нет, вы можете прочитать их исходный код и изменить его на свой язык.

Ответ 18

с использованием BioSPPY

в настоящее время возможно реализовать Т-волновой анализ, поскольку в настоящее время он содержит только R-волновой анализ. например, Tstart Tpeak Tend

не будут автоматически имплантированы

вам придется использовать свой собственный анализ.

Мое предложение состояло в том, чтобы попытаться реализовать нижеописанный метод

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3201026/

который я недавно открыл и нашел очень интересным

Другой метод анализа t-волн, на который стоит обратить внимание, заключается в том, что команда ECGlib

http://ieeexplore.ieee.org/document/6713536/

надеюсь, что это поможет