Скачиваний:
0
Добавлен:
12.02.2026
Размер:
630.99 Кб
Скачать

Список литературы

1. Электрокардиография // Малая советская энциклопедия. В 10 т. Т. 10. – 2-е изд. – М.: ОГИЗ РСФСР, 1947.

2. Гришкин Ю.Н., Журавлева Н.Б. Основы клинической электрокардиографии. СПб.: Фолиант, 2008. 160 с.

3. Кардиология по Херсту. В 3 т. Т. 1 / под ред. В. Фустера, Р.А. Харрингтона, Д. Нарулы, З.Дж. Ипена. М.: ГЭОТАР-Медиа, 2023.

4. Мурашко В.В. Электрокардиография: учеб. пособие. 14-е изд., перераб. М.: МЕДпресс-информ, 2017. 360 с.

5. Синицкий В. Электрокардиограмма (ЭКГ)/ Оптимус Медикус. URL: https://web.archive.org/web/20220408065525/https:/optimusmedicus.com/kardiologiia/ekg/ (дата обращения: 22.10.2025).

6. Погвизд С. Гл. 5. Анализ электрокардиограммы // Кардиология в таблицах и схемах / под ред. М. Фрида, С. Грайнса, М.: Практика, 1996.

7. Петров П.В. Решение инженерных задач в системе Matlab: учебное пособие / Пензенский государственный университет. Пенза, 2006. – 43 с.

8. Колганов К.Ю. Вычислительные методы электрокардиологии: учебное пособие / Пензенский государственный университет. Пенза, 2016. – 97 с.

Приложение Листинг кода

#include <iostream>

#include <fstream>

#include <vector>

using namespace std;

class ECG {

protected:

class Complex {

public:

string name;

class Wave {

public:

string name;

float a;

float b1;

float b2;

float u;

};

vector<Wave> wave_set;

};

vector<Complex> type_set;

vector <float> do_ECG(float& Fs, float& HR, vector <Complex::Wave>& Complex) {

vector <float> ECG;

for (short i = 0; i < ((int)(Fs * HR / 60 * 0.95) + rand() % (int)(Fs * HR / 60 * 0.1)); i++) {

ECG.push_back(0);

for (short j = 0; j < Complex.size(); j++) {

if (i < Complex[j].b1 * Fs)

ECG[i] += Complex[j].a * exp(-pow(((float)(i / Fs) - Complex[j].u), 2) / (2 * Complex[j].b1 * Complex[j].b1));

else

ECG[i] += Complex[j].a * exp(-pow(((float)(i / Fs) - Complex[j].u), 2) / (2 * Complex[j].b2 * Complex[j].b2));

}

}

return ECG;

}

public:

void push(string name, const vector<Complex::Wave> wave_set) {

Complex new_type;

new_type.name = name;

new_type.wave_set = wave_set;

type_set.push_back(new_type);

}

void del(string name) {

if (type_set.empty()) {

cout << "No types found" << endl;

return;

}

for (short i = 0; i < type_set.size(); i++) {

if (type_set[i].name == name) {

type_set.erase(type_set.begin() + i);

return;

}

}

cout << "Complex not found" << endl;

return;

}

vector<float> calculate(float Fs, float HR, short n, string name) {

if (type_set.empty()) {

cout << "No types found" << endl;

return {};

}

else {

for (short i = 0; i < type_set.size(); i++) {

if (type_set[i].name == name) {

vector <float> ECG;

for (int j = 0; j < n; j++) {

vector <Complex::Wave> temp_waveset = type_set[i].wave_set;

for (short j = 0; j < temp_waveset.size(); j++) {

temp_waveset[j].a *= 0.97f + (rand() % 10 * 0.01f);

}

const auto& temp = do_ECG(Fs, HR, temp_waveset);

ECG.insert(ECG.end(), temp.begin(), temp.end());

}

return ECG;

}

}

cout << "Complex not found" << endl;

return {};

}

}

};

int main() {

float Fs = 200.f;

float HR = 60.f;

ECG* dataset = new ECG;

dataset->push("Normal",

{

{"P", 0.11f, 0.014f, 0.014f, 0.399f},

{"Q", -0.004f, 0.008f, 0.008f, 0.45f},

{"R", 1.453f, 0.008f, 0.008f, 0.474f},

{"S", -1.053f, 0.007f, 0.007f, 0.495f},

{"ST", 0.063f, 0.04f, 0.04f, 0.574f},

{"T", 0.52f, 0.056f, 0.024f, 0.7f}

});

dataset->push("ST_depression",

{

{ "P", 0.04f, 0.03f, 0.03f, 0.203f },

{ "Q", .0f, 0.066f, 0.066f, 0.266f },

{ "R", 0.64f, 0.016f, 0.026f, 0.296f },

{ "S", -0.1f, 0.03f, 0.03f, 0.4f },

{ "ST", -0.23f, 0.15f, 0.2f, 0.45f },

{ "T", 0.06f, 0.1f, 0.08f, 0.7f }

});

dataset->push("Ventricular_extrasystole",

{

{ "P", .0f, 0.03f, 0.03f, 0.08f },

{ "Q", 0.3f, 0.01f, 0.03f, 0.1f },

{ "R", 1.3f, 0.04f, 0.04f, 0.2f },

{ "S", -0.1f, 0.01f, 0.015f, 0.28f },

{ "ST", -0.18f, 0.1f, 0.1f, 0.34f },

{ "T", -0.19f, 0.04f, 0.04f, 0.39f }

}

);

vector <float> ECG = dataset->calculate(Fs, HR, 1, "Normal");

ofstream file("Normal.txt");

if (file.fail()) {

throw system_error(errno, std::system_category(), "Failed to open file: Normal.txt");

}

else {

for (int i = 0; i < ECG.size(); i++) {

file << ECG[i] << endl;

}

}

file.close();

ECG = dataset->calculate(Fs, HR, 1, "ST_depression");

ofstream file2("ST_depression.txt");

if (file2.fail()) {

throw system_error(errno, std::system_category(), "Failed to open file: ST_depression.txt");

}

else {

for (int i = 0; i < ECG.size(); i++) {

file2 << ECG[i] << endl;

}

}

file2.close();

ECG = dataset->calculate(Fs, HR, 1, "Ventricular_extrasystole");

ofstream file3("Ventricular_extrasystole.txt");

if (file3.fail()) {

throw system_error(errno, std::system_category(), "Failed to open file: Ventricular_extrasystole.txt");

}

else {

for (int i = 0; i < ECG.size(); i++) {

file3 << ECG[i] << endl;

}

}

file3.close();

ECG.clear();

vector<float> temp;

srand(time(NULL));

for (int i = 0; i < 20; i++) {

if (rand() % 100 > 90) {

temp = dataset->calculate(Fs, HR, 1, "Ventricular_extrasystole");

ECG.insert(ECG.end(),

temp.begin(),

temp.end());

}

else if (rand() % 100 < 10) {

temp = dataset->calculate(Fs, HR, 1, "ST_depression");

ECG.insert(ECG.end(),

temp.begin(),

temp.end());

}

else {

temp = dataset->calculate(Fs, HR, 1, "Normal");

ECG.insert(ECG.end(),

temp.begin(),

temp.end());

}

temp.clear();

}

ofstream file4("Random.txt");

if (file4.fail()) {

throw system_error(errno, std::system_category(), "Failed to open file: Random.txt");

}

else {

for (int i = 0; i < ECG.size(); i++) {

file4 << ECG[i] << endl;

}

}

file4.close();

delete dataset;

return 0;

}

Соседние файлы в папке Модель ЭКГ