Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИДЗ / Модель ЭЭГ / КР_Малышев_2503

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

Из графиков видно, что спектр реально сигнала, хоть также имеет пики на разных частотах, однако они не так ярко выражены, как у сгенерированного сигнала, из чего можно сделать вывод, что в данной моделью не удалось достичь такого же гладкого спектра, как на реальной ЭКГ с преобладающим бета ритмом.

Для развития модели можно подобрать более удачные коэффициенты и функцию активации для получения более равномерно распределённого спектра сигнала. Также, можно подобрать параметры модели для создания сигнала с другими преобладающими ритмами. Подбор параметров можно автоматизированно проводить программными методами, если разработать функцию потерь, рассчитываемую на основе спектров реального и синтезированного сигналов.

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

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