Разработка нейроинтерфейса: от снятия ЭЭГ до ПО на Python

Курс посвящен созданию аппаратно-программного комплекса для нейроинтерфейса. Вы изучите принципы снятия ЭЭГ, освоите программирование микроконтроллеров STM32H723VTG6 и научитесь разрабатывать софт для обработки сигналов мозга на Python 3.

1. Основы нейроинтерфейсов и базовые принципы их программирования

Основы нейроинтерфейсов и базовые принципы их программирования

Нейрокомпьютерный интерфейс (НКИ) или Brain-Computer Interface (BCI) — это система, созданная для прямого обмена информацией между мозгом человека и внешним электронным устройством. В отличие от классических способов взаимодействия с техникой, таких как клавиатура, мышь или сенсорный экран, нейроинтерфейсы позволяют передавать команды, минуя мышечную систему.

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

> Почти 50 лет прошло с момента зарождения словосочетания «интерфейс мозг — компьютер». В 1973 году его впервые использовал в своей научной статье учёный из Калифорнийского университета Жак Видаль. > > engineer.yadro.com

Чтобы понять, как программировать такие системы, необходимо разобраться в физической природе сигналов, аппаратном обеспечении для их захвата и программных алгоритмах обработки.

Электроэнцефалография: чтение электрических бурь

Основа большинства неинвазивных (не требующих хирургического вмешательства) нейроинтерфейсов — электроэнцефалография (ЭЭГ). Человеческий мозг состоит из миллиардов нейронов, которые общаются друг с другом посредством слабых электрических импульсов. Когда большие группы нейронов активируются синхронно, они создают электрическое поле, которое можно зафиксировать на поверхности кожи головы.

Главная проблема ЭЭГ заключается в том, что сигнал невероятно слаб и подвержен сильным искажениям.

Амплитуда сигнала ЭЭГ подчиняется условию , где — амплитуда в микровольтах. Для сравнения: обычная пальчиковая батарейка выдает напряжение 1,5 вольта, что равно 1 500 000 микровольт. Сигнал мозга слабее батарейки минимум в 15 000 раз.

Помимо слабости сигнала, на него накладываются артефакты: моргание глаз, сердцебиение, напряжение мышц челюсти и даже наводки от бытовой электросети (50 или 60 Гц). Поэтому сырой сигнал ЭЭГ выглядит как хаотичный шум, из которого предстоит извлечь полезную информацию.

Аппаратный уровень: от электродов к цифре

Путь сигнала от головы человека до программы на компьютере состоит из нескольких этапов. Сначала электроды улавливают изменения потенциала. Затем аналоговый усилитель увеличивает мощность сигнала. После этого в дело вступает аналого-цифровой преобразователь (АЦП) и микроконтроллер.

В профессиональных и продвинутых любительских проектах часто используется микроконтроллер STM32H723VTG6. Это мощный чип на базе архитектуры ARM Cortex-M7, который идеально подходит для задач цифровой обработки сигналов в реальном времени.

Ключевые задачи микроконтроллера в нейроинтерфейсе: * Опрос АЦП с высокой и строго фиксированной частотой (например, 250 или 500 раз в секунду). * Первичная аппаратная фильтрация сигнала. * Упаковка оцифрованных данных в пакеты. * Передача пакетов на компьютер по интерфейсу USB или UART.

Ниже приведен концептуальный пример кода на языке C для микроконтроллера STM32, демонстрирующий логику запуска преобразования АЦП:

Если микроконтроллер собирает данные с 8 каналов с частотой дискретизации Гц, а каждое значение занимает 3 байта (24-битный АЦП), то объем передаваемых данных составит: 8 каналов × 250 измерений × 3 байта = 6000 байт в секунду. Это небольшой поток данных, но он требует абсолютной непрерывности.

Программный конвейер на Python 3

Когда оцифрованный сигнал попадает на компьютер, начинается этап программной обработки. Язык Python 3 стал стандартом де-факто в разработке нейроинтерфейсов благодаря богатой экосистеме библиотек для научных вычислений и машинного обучения.

Разделение зон ответственности между аппаратной и программной частями можно представить следующим образом:

| Характеристика | Микроконтроллер (STM32) | Компьютер (Python 3) | |---|---|---| | Основная задача | Сбор и оцифровка в реальном времени | Математический анализ и классификация | | Язык программирования | C / C++ | Python 3 | | Вычислительная мощность | Ограниченная (сотни МГц) | Высокая (многоядерные процессоры, ГПУ) | | Задержка (Latency) | Микросекунды | Миллисекунды |

Программирование нейроинтерфейса на Python строится по строгому конвейеру (pipeline), который состоит из четырех последовательных шагов.

1. Сбор данных (Data Acquisition)

Программа должна непрерывно читать данные из последовательного порта, распаковывать байты и формировать из них массивы. Для этого в Python используется библиотека pyserial, а для хранения данных — numpy.

2. Предобработка и фильтрация (Preprocessing)

Сырой массив данных пропускается через цифровые фильтры. Библиотека scipy.signal позволяет создать режекторный фильтр (notch filter), который вырезает ровно 50 Гц (помехи от электросети), а также полосовой фильтр (bandpass filter), оставляющий только полезные частоты мозга, например, от 1 до 50 Гц.

3. Извлечение признаков (Feature Extraction)

Алгоритмам машинного обучения сложно работать с сырыми колебаниями. Поэтому сигнал преобразуют из временной области в частотную с помощью быстрого преобразования Фурье. Это позволяет узнать, какая мощность сигнала приходится на альфа-ритмы (состояние покоя) или бета-ритмы (концентрация внимания).

Например, если мощность альфа-ритма (8-12 Гц) увеличилась на 40% по сравнению с базовым состоянием, программа может сделать вывод, что пользователь закрыл глаза и расслабился.

4. Классификация (Classification)

На финальном этапе извлеченные признаки передаются в модель машинного обучения (например, метод опорных векторов или нейронную сеть, реализованные в библиотеке scikit-learn). Модель сопоставляет текущие характеристики сигнала с заранее записанными шаблонами и принимает решение: «пользователь хочет сдвинуть курсор влево» или «пользователь хочет включить свет».

Разработка нейроинтерфейса — это комплексный процесс, требующий понимания как низкоуровневого программирования железа, так и высокоуровневой математики. Синхронизация работы STM32 и скриптов на Python позволяет создать надежный мост между человеческой мыслью и цифровым миром.