ИДЗ / Модель ЭЭГ / КР_Малышев_2503
.pdfИз графиков видно, что спектр реально сигнала, хоть также имеет пики на разных частотах, однако они не так ярко выражены, как у сгенерированного сигнала, из чего можно сделать вывод, что в данной моделью не удалось достичь такого же гладкого спектра, как на реальной ЭКГ с преобладающим бета ритмом.
Для развития модели можно подобрать более удачные коэффициенты и функцию активации для получения более равномерно распределённого спектра сигнала. Также, можно подобрать параметры модели для создания сигнала с другими преобладающими ритмами. Подбор параметров можно автоматизированно проводить программными методами, если разработать функцию потерь, рассчитываемую на основе спектров реального и синтезированного сигналов.
21
Заключение
В ходе работы были исследованы различные способы моделирования сигнала электроэнцефалограммы. Рассмотрены плюсы и минусы разных подходов, а также выбрана модель для реализации.
Выбранная модель – модель Уилсона-Коуэна – является компромиссом между вычислительной сложностью, сложностью реализации и биологической схожестью моделей. На основе модели был реализован код на языке C++ для синтеза искусственной ЭЭГ по заданным параметрам.
Были подобраны параметры модели для генерации устойчивого сигнала с преобладающим бета-ритмом. В соответствии с параметрами сгенерирован сигнал длиной 30 секунд и частотой 500 Гц.
Был проведён сравнительный анализ сгенерированного сигнала с Гауссовским шумом и реальным сигналом. Несмотря на то, что синтетический сигнал порождается Гауссовским шумом, сам он имеет относительно ограниченный и более сглаженный спектр в отличии от шума, что делает его более похожим на реальный сигнал ЭЭГ. Распределение мощностей в синтетическом сигнале показало преобладание бета-ритма, что доказывает работоспособность модели.
Однако модель не совершенна, так как имеет менее равномерно распределённый спектр по сравнению с реальным сигналом ЭЭГ. Для решения этой проблемы можно программными методами подобрать более удачные коэффициенты для модели, изменить функцию активации или порождающий сигнал.
22
Список литературы
1.Электроэнцефалография (ЭЭГ) // CMI Brain Research. URL: https://cmi.to/электроэнцефалография-ээг/ (дата обращения: 08.10.2025)
2.Ритмы ЭЭГ // // CMI Brain Research. URL: https://cmi.to/ритмы-ээг/ (дата обращения: 08.10.2025)
3.Спектральный анализ ЭЭГ // CMI Brain Research. URL: https://cmi.to/методы/спектральный-анализ/ (дата обращения: 22.10.2025)
4. Феномен уравнения ван дер Поля / А. П. Кузнецов,
Е. С. Селиверстова, Д. И. Трубецков, Л. В. Тюрюкина // Известия вузов. ПНД. 2014. Т. 22, вып. 4. С. 3-42.
5. Wilson H.R., Cowan J.D. Excitatory and inhibitory interactions in localized populations of model neurons // Biophysical Journal. 1972, vol. 12, № 1. P. 1–24.
6.Jansen B.H., Rit V.G. Electroencephalogram and visual evoked potential generation in a mathematical model of coupled cortical columns // Biological Cybernetics. 1995, vol. 73, № 4. P. 357–366.
7.Кувакин А.С., Максимов А.И., Чухловина М.Р. Моделирование ЭЭГ-
потенциалов с использованием однодипольной модели электрической активности головного мозга // Современные проблемы науки и образования. 2017. № 6. URL: https://science-education.ru/ru/article/view?id=27216 (дата обращения: 23.10.2025).
8. Nunez P.L. The brain wave equation: a model for the EEG // Mathematical Biosciences. 1974, vol. 21, № 3–4. P. 279–297. URL: https://pmc.ncbi.nlm.nih/articles/PMC1484078/pdf/biophysj007270011.pdf (дата обращения: 23.10.2025).
23
Приложение
Листинг кода модуля расчёта ЭЭГ
Код файла EEG_module.cpp:
#include "EEG_module.h"
EEG_pattern_factory::EEG_pattern_factory() { EEG_patterns.insert({ "beta",
WC_args{
0.002f, // tauE 0.1f, // tauI 30.0f, //wEE 80.0f, //wEI 80.0f, //wIE 4.0f, //wII 0.5f, //nuE 3.f, //nuI 0.5f, //thetaE 0.5f, //thetaI 1.0f, //rE 1.0f, //rI 5.f, //P
5.f //Q
} }
);
}
std::optional<WC_args> EEG_pattern_factory::createPattern(const std::string& name) {
auto it = EEG_patterns.find(name); if (it == EEG_patterns.end()) {
return std::nullopt;
}
return it->second;
}
int EEG::size() {
return patterns.size();
}
void EEG::push(std::string name, const WC_args& complex) { patterns.insert({ name, complex });
}
int EEG::del(const std::string& name) { if (patterns.empty()) {
24
std::cout << "No types found" << std::endl; return -1;
}
auto it = patterns.find(name); if (it == patterns.end()) {
std::cout << "Complex not found" << std::endl; return -2;
}
patterns.erase(it); return 0;
}
std::optional<std::vector<float>> EEG::calc(float Fs, float tmax, const std::string& name) {
if (patterns.empty()) {
std::cout << "No types found" << std::endl; return std::nullopt;
}
auto it = patterns.find(name); if (it == patterns.end()) {
std::cout << "Complex not found" << std::endl; return std::nullopt;
}
WC_args& pattern = it->second; std::vector <float> EEG;
float E = 0.5f; float I = 0.5f;
for (size_t i = 0; i < static_cast<int>(floor(tmax * Fs) + 1); ++i) {
step(E, I, Fs, pattern);
if (static_cast<float>(i) > Fs) EEG.push_back(E);
}
for (int i = 2; i < EEG.size() - 1; ++i) {
EEG[i] = (EEG[i] * i + EEG[i - 1] * 0.5 * (i - 2) + EEG[i - 2] * 0.5 * (i - 2)) / (i + 0.5 * (i - 2) + 0.5 * (i - 2));
}
return EEG;
}
float EEG::S_E(float x, WC_args& args) {
return 1.0f / (1.0f + std::exp(-args.nuE * (x - args.thetaE)));
25
}
float EEG::S_I(float x, WC_args& args) {
return 1.0f / (1.0f + std::exp(-args.nuI * (x - args.thetaI)));
}
void EEG::step(float& E, float& I, float Fs, WC_args& args) {
float P = 0.2 / (args.sigma_P * sqrt(2.f * 3.1415f)) * exp(- 1.f / 2.f * pow(((rand() % 1000 / 1000.f * args.sigma_P) - args.sigma_P / 2) / args.sigma_P, 2));
float Q = 0.2 / (args.sigma_Q * sqrt(2.f * 3.1415f)) * exp(- 1.f / 2.f * pow(((rand() % 1000 / 1000.f * args.sigma_Q) - args.sigma_Q / 2) / args.sigma_Q, 2));
float XE = args.wEE * E - args.wEI * I + P; float XI = args.wIE * E - args.wII * I + Q;
float SE = S_E(XE, args); float SI = S_I(XI, args);
E += (-E + (1.0f - args.rE * E) * SE) / (args.tauE * Fs); I += (-I + (1.0f - args.rI * I) * SI) / (args.tauI * Fs);
if (E < 0.0f) E = 0.0f; if (E > 1.0f) E = 1.0f; if (I < 0.0f) I = 0.0f; if (I > 1.0f) I = 1.0f;
}
26
Код файла EEG_module.h:
#ifndef EEG_module_H #define ECG_module_H #include <iostream> #include <vector> #include <optional> #include <string> #include <unordered_map> #include <math.h>
struct WC_args
{
float tauE; float tauI;
//Веса связей float wEE; float wEI; float wIE; float wII;
//Параметры сигмоид float nuE;
float nuI; float thetaE; float thetaI;
//Рефрактерность float rE;
float rI;
//Внешние входы float sigma_P; float sigma_Q;
};
class EEG_pattern_factory { public:
EEG_pattern_factory();
std::optional<WC_args> createPattern(const std::string& name);
private:
std::unordered_map<std::string, WC_args> EEG_patterns;
};
27
class EEG { public:
int size();
void push(std::string name, const WC_args& complex); int del(const std::string& name);
std::optional<std::vector<float>> calc(float Fs, float tmax, const std::string& name);
private:
std::unordered_map<std::string, WC_args> patterns; float S_E(float x, WC_args& args);
float S_I(float x, WC_args& args);
void step(float& E, float& I, float Fs, WC_args& args);
};
#endif
28
