Алгоритм вычисления частоты сердечных сокращений

Продолжаем выкладывать полезности! Вашему вниманию алгоритм вычисления мгновенной частоты сердечных сокращений по сигналу электрокардиограммы. Традиционно вычисление мгновенных значений периода сердечных сокращений состоит в поиске моментов времени, которые соответствуют зубцам R фрагмента кардиограммы (максимального значения). Однако, при отклонениях электрической оси сердца от ее нормального положения, а также в условиях зашумленности сигнала, такой подход дает некорректные результаты, и частота сердечных сокращений определяется неправильно. Ниже представлен более устойчивый к ошибкам алгоритм определения ЧСС по ЭКГ.

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

Итак, приступим к теории. Лучший результат показал алгоритм вычисления длительности кардиоцикла, основанный на поиске моментов опорная точка для вычисления чссвремени опорных точек первой производной кардиосигнала.  При этом за опорную точку кардиоцикла удобно принимать половину минимального значения производной (можно посмотреть на рисунке).

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

Алгоритм подсчета ЧСС из фрагмента ЭКГ длинной N отсчетов следующий:

  • Вычисляем первую производную ЭКГ по времени.
  • Сглаживаем первую производную по методу скользящего среднего.
  • Находим моменты времени, которые соответствуют выбранной нами опорной точке кардиограммы.
  • Вычисляем мгновенную ЧСС как разность между двумя последовательными моментами времени, соответствующими опорной точке.

Алгоритм можно представить следующей блок-схемой:

heart-rate-algorithm-2

Пример реализации алгоритма поиска ЧСС приводим ниже. Внимание! Не следует использовать ниже приведенный C-подобный псевдокод через "копипаст"! Это пример реализации алгоритма, который вы можете доработать под свои нужды.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int samplerate = 1000; //частота дискретизации кардиосигнала
double iToTime(int i){ // функция преобразования порядкового номера отсчета в момент времени в секундах от начала фрагмента
  if(i > 0 && fs > 0){
    double res = i/(double)samplerate;
    return res;
  }
  return 0;
}
int num = N; //количество отчетов сигнала ЭКГ в исследуемом фрагменте
float minECG = 0; // переменная, в которую запишем минимальное значение для всех отчетов фрагмента
float ECGSamples[N] = GetECGData(); //массив N отчетов кардиограммы
float ECGDerivative[M]; //массив для хранения производной фрагмента кардиограммы (M = N - 1)
//находим производную фрагмента кардиограммы
float dt = 1.0/samplerate; //шаг по времени для расчета производной
 
for (int i = 0; i < num - 2; i++) {
  ECGDerivative[i] = (ECGSamples[i] - ECGSamples[i+1]) / dt;
}
// находим минимум производной исследуемого фрагмента кардиограммы
minECG = 1000;
for(int i = 0; i < num - 2; i++) {
  if (minECG > ECGDerivative[i]){
    minECG = ECGDerivative[i];
  }
}
//находим опорную точку - половину минимального значения производной
minECG *= 0.5;
 
int RefPointTime = 0;//переменная для хранения последнего момента времени отчета кардиосигнала, который соответствует опорной точке
int HRArray[O]; //массив для хранения мгновенных значений ЧСС
 
//находим моменты времени, которые соответствуют выбранной нами опорной точке кардиограммы
for(int i = 1; i < num - 2; i++){
  if(minECG > ECGDerivative[i] && minECG < ECGDerivative[i - 1]) {
    if (i > 1) {
      HRArray[i] = (int)(60 / (RefPointTime - iToTime(i)) + 0.5); //сохраняем значение мгновенной ЧСС с преобразованием к целому числу
    }
    RefPointTime = iToTime(i); //сохраняем момент времени отчета кардиосигнала, который соответствует опорной точке
  }
}
int samplerate = 1000; //частота дискретизации кардиосигнала
double iToTime(int i){ // функция преобразования порядкового номера отсчета в момент времени в секундах от начала фрагмента
  if(i > 0 && fs > 0){
    double res = i/(double)samplerate;
    return res;
  }
  return 0;
}
int num = N; //количество отчетов сигнала ЭКГ в исследуемом фрагменте
float minECG = 0; // переменная, в которую запишем минимальное значение для всех отчетов фрагмента
float ECGSamples[N] = GetECGData(); //массив N отчетов кардиограммы
float ECGDerivative[M]; //массив для хранения производной фрагмента кардиограммы (M = N - 1)
//находим производную фрагмента кардиограммы
float dt = 1.0/samplerate; //шаг по времени для расчета производной

for (int i = 0; i < num - 2; i++) {
  ECGDerivative[i] = (ECGSamples[i] - ECGSamples[i+1]) / dt;
}
// находим минимум производной исследуемого фрагмента кардиограммы
minECG = 1000;
for(int i = 0; i < num - 2; i++) {
  if (minECG > ECGDerivative[i]){
    minECG = ECGDerivative[i];
  }
}
//находим опорную точку - половину минимального значения производной
minECG *= 0.5;

int RefPointTime = 0;//переменная для хранения последнего момента времени отчета кардиосигнала, который соответствует опорной точке
int HRArray[O]; //массив для хранения мгновенных значений ЧСС

//находим моменты времени, которые соответствуют выбранной нами опорной точке кардиограммы
for(int i = 1; i < num - 2; i++){
  if(minECG > ECGDerivative[i] && minECG < ECGDerivative[i - 1]) {
    if (i > 1) {
      HRArray[i] = (int)(60 / (RefPointTime - iToTime(i)) + 0.5); //сохраняем значение мгновенной ЧСС с преобразованием к целому числу
    }
    RefPointTime = iToTime(i); //сохраняем момент времени отчета кардиосигнала, который соответствует опорной точке
  }
}

Вы можете использовать приведенный алгоритм по своему усмотрению в ваших проектах. Приветствуется обратная связь с нами и ссылка на наш сайт vdd-pro.ru.

как вычислить чсс по экг, алгоритм расчета чсс, вычислить чсс по экг, частота сердечного ритма по кардиограмме, узнать чсс из экг, исходный код расчет ЧСС, программа для вычисления частоты сердечных сокращений

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

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