Список литературы
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;
}
