ИДЗ / Модель ЭКГ / Новикова_2503
.pdfСписок литературы
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/kardiologii a/ekg/ (дата обращения: 22.10.2025).
6.Погвизд С. Гл. 5. Анализ электрокардиограммы // Кардиология в таблицах и схемах / под ред. М. Фрида, С. Грайнса, М.: Практика, 1996.
7.Петров П.В. Решение инженерных задач в системе Matlab: учебное пособие / Пензенский государственный университет. Пенза, 2006. – 43 с.
8.Колганов К.Ю. Вычислительные методы электрокардиологии: учебное пособие / Пензенский государственный университет. Пенза, 2016. – 97 с.
21
Приложение
Листинг кода
#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));
}
}
22
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());
23
}
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");
24
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(),
25
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;
}
26
