- •Аннотация
- •Содержание
- •Введение
- •Глава 1: Теоретическая основа
- •1.1 Электроэнцефалография
- •1.2 Частотный состав ээг
- •1.3 Модели для генерации искусственных ээг
- •Глава 2: Разработка модели
- •2.1 Анализ выбранной модели
- •2.2 Реализация модели
- •Глава 3: Результаты
- •Заключение
- •Список литературы
- •Приложение Листинг кода модуля расчёта ээг
Заключение
В ходе работы были исследованы различные способы моделирования сигнала электроэнцефалограммы. Рассмотрены плюсы и минусы разных подходов, а также выбрана модель для реализации.
Выбранная модель – модель Уилсона-Коуэна – является компромиссом между вычислительной сложностью, сложностью реализации и биологической схожестью моделей. На основе модели был реализован код на языке C++ для синтеза искусственной ЭЭГ по заданным параметрам.
Были подобраны параметры модели для генерации устойчивого сигнала с преобладающим бета-ритмом. В соответствии с параметрами сгенерирован сигнал длиной 30 секунд и частотой 500 Гц.
Был проведён сравнительный анализ сгенерированного сигнала с Гауссовским шумом и реальным сигналом. Несмотря на то, что синтетический сигнал порождается Гауссовским шумом, сам он имеет относительно ограниченный и более сглаженный спектр в отличии от шума, что делает его более похожим на реальный сигнал ЭЭГ. Распределение мощностей в синтетическом сигнале показало преобладание бета-ритма, что доказывает работоспособность модели.
Однако модель не совершенна, так как имеет менее равномерно распределённый спектр по сравнению с реальным сигналом ЭЭГ. Для решения этой проблемы можно программными методами подобрать более удачные коэффициенты для модели, изменить функцию активации или порождающий сигнал.
Список литературы
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/biophysj00727-0011.pdf (дата обращения: 23.10.2025).
Приложение Листинг кода модуля расчёта ээг
Код файла 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()) {
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)));
}
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;
}
Код файла 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;
};
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
