Uploaded by Dark One

Encephalogram processing software

advertisement
Министерство образования Республики Беларусь
Учреждение образования
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Факультет компьютерных систем и сетей
Кафедра программного обеспечения информационных технологий
К защите допустить:
Заведующая кафедрой ПОИТ
____________Н. В. Лапицкая
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к дипломному проекту
на тему
ПРОГРАММНОЕ СРЕДСТВО
ОБРАБОТКИ ЭНЦЕФАЛОГРАММ
БГУИР ДП 1-40 01 01 127 ПЗ
Студент
В. С. Невгень
Руководитель
И. М. Марина
Консультанты:
от кафедры ПОИТ
по экономической части
И. М. Марина
С. В. Наркевич
Нормоконтролер
С. В. Болтак
Рецензент
Минск 2023
РЕФЕРАТ
ПРОГРАМНОЕ СРЕДСТВО ОБРАБОТКИ ЭЛЕКТРОЭНЦЕФАЛОГРАММ:
дипломный проект / В.С. Невгень. – Минск: БГУИР, 2023, – п.з. – 98 с., чертежей
(плакатов) – 6 л. формата А1.
Цель настоящего дипломного проекта состоит в разработке программного средства, предназначенного для обработки энцефалограмм.
При разработке и внедрении приложения используется следующий стек технологий: Tensorflow, Python, numpy, matplotlib, CSV, os, SciPy, Pandas.
В первом разделе проводится обзор существующих программных средств,
предназначенных для обработки электроэнцефалограмм. После анализа существующих решений выдвигаются общие требования к созданию программного средства.
Во втором разделе проводится разработка структуры программного средства, а
также разработка функциональных требований.
Третий раздел посвящён проектированию алгоритмов преобразований и анализа сигналов и проектированию архитектуры программного средства. Также третий
раздел описывает основные алгоритмы, обеспечивающие работу разрабатываемого
продукта.
В четвертом разделе описывается процесс создания программного средства: реализация модулей, классов и алгоритмов, необходимых для его работы. Так же в данном разделе представлены основные диаграммы алгоритмов для загрузки сигналов,
проведение корреляционного анализа, для преобразования Фурье, высокочастотного
фильтра Баттерворта, низкочастотного фильтра Баттерворта, просмотра графиков
сигналов.
В пятом разделе содержится информация о тестировании разработанного приложения на соответствие функциональным требованиям. Раздел содержит набор
тест-кейсов с результатами проверки работоспособности программы.
Шестой раздел содержит руководство пользователя. В нем шаг за шагом поясняется использование тех или иных возможностей программного средства.
В седьмом разделе приведено технико-экономическое обоснование разработки
и внедрения программного средства.
Заключение содержит краткие выводы по дипломному проекту.
Дипломный проект является завершённым, поставленная задача решена в полной мере. Планируется дальнейшее развитие программного средства и расширение
его функциональности. Проект выполнен самостоятельно, проведён анализ оригинальности в системе «Антиплагиат». Процент оригинальности составляет 92,41%.
Цитирования обозначены ссылками на публикации, указанные в «Списке использованных источников».
2
Министерство образования Республики Беларусь
Учреждение образования
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ
И РАДИОЭЛЕКТРОНИКИ
Факультет
Специальность
КС и С
1-40 01 01
Кафедра ПОИТ
Специализация 01
УТВЕРЖДАЮ
Н.В.Лапицкая
«
»
20
г.
ЗАДАНИЕ
по дипломному проекту студента
Невгеня Владислава Сергеевича
(фамилия, имя, отчество)
1. Тема проекта:
Программное средство обработки энцефалограмм
утверждена приказом по университету от
«
27
»
марта
2023 г.
№ 748-c
2 . Срок сдачи студентом законченной работы 01 июня 2023 года
3. Исходные данные к проекту Тип операционной системы – ОС Windows 10 Home;
Язык программирования – Python;
Перечень выполняемых функций: отображение сигналов, поиск сигналов Р300
корреляционный анализ, выбор видов отображения сигналов, сохранение результатов обработки, фильтрация низкочастотная, фильтрация высокочастотная.
Формат исходных данных соответствует формату файлов, формируемых ИВК «Тембр».
Назначение разработки: цифровая обработка сигналов
4. Содержание пояснительной записки (перечень подлежащих разработке вопросов)
Введение
1 Анализ методов цифровой обработки сигналов
2 Математические модели цифровой обработки сигналов
3 Разработка структуры и схемы программы
4 Разработка алгоритмов и программного кода
5 Тестирование программного средства
6 Руководство пользователя
7 Технико-экономическое обоснование программного средства обработки энцефалограмм
8 Охрана труда
Заключение
Список использованных источников
Приложение. Листинг программы
3
4
СОДЕРЖАНИЕ
Введение ............................................................................................................................... 7
1 Анализ методов цифровой обработки сигналов ........................................................... 8
1.1 Цифровой анализ сигналов ....................................................................................... 8
1.2 Программные средства обработки сигналов ......................................................... 12
1.3 Постановка задачи.................................................................................................... 15
2 Математические модели цифрового анализа сигналов .............................................. 16
2.1 Преобразование Фурье ............................................................................................ 16
2.2 Вейвлет - анализ ....................................................................................................... 18
2.3 Корреляционный анализ .......................................................................................... 20
3 Разработка структуры и схемы программы ................................................................. 24
3.1 Спецификация требований ...................................................................................... 24
3.2 Use Case – диаграмма............................................................................................... 26
3.3 Функциональная структура программы ...... Ошибка! Закладка не определена.
3.4 Схема программы ..................................................................................................... 28
4 Разработка алгоритмов и программного кода ............................................................. 32
4.1 Разработка алгоритмов для загрузки сигналов ..................................................... 32
4.2 Разработка алгоритмов для проведения корреляционного анализа ................... 34
4.2 Разработка алгоритмов для выбора вида отображения графиков....................... 37
4.3 Разработка программного кода ............................................................................... 42
5 Тестирование программного средства ......................................................................... 44
6 Руководство пользователя ............................................................................................. 63
7 Технико-экономическое обоснование .......................................................................... 71
7.1 Краткая характеристика разрабатываемой системы ........ Ошибка! Закладка не
определена.
7.2 Расчёт сметы затрат, себестоимости и отпускной цены . Ошибка! Закладка не
определена.
8 Охрана труда. Реализация пространственно-антропометрической эргономической
совместимости работника и персонального компьютера при работе с программным
средством многоканальной обработки сигналов . Ошибка! Закладка не определена.
8.1 Сущность пространственно - антропометрической эргономической
совместимости ...................................................... Ошибка! Закладка не определена.
8.2 Характеристика трудового процесса, трудовой функции работника. .... Ошибка!
Закладка не определена.
8.3 Проектирование рабочего места с реализацией пространственно антропометрической эргономической совместимости .......... Ошибка! Закладка не
определена.
Заключение......................................................................................................................... 80
Список использованных источников .............................................................................. 81
Приложение А. Листинг программы ............................................................................... 83
5
ОПРЕДЕЛЕНИЯ И СОКРАЩЕНИЯ
В настоящей пояснительной записке применяются следующие термины, обозначения и сокращения.
Сигнал – (франц. signal, нем. Signal, от лат. signum - знак), знак, физический
процесс или явление, несущие сообщение о каком-либо событии, состоянии объекта
либо передающие команды управления, оповещения и т. д.
Спектр – скалярная функция частоты, длины волны или, реже, другой физической величины (например, энергии, массы частиц), определяющая относительную
представленность значений данной величины в изучаемом объекте: сложном сигнале, многокомпонентной среде и пр..
Спектр является дискретным, если между соседними простыми колебаниями
определен шаг, равный некоторой конечной величине.
Спектр является непрерывным, если шаг между соседними простыми колебаниями бесконечно мал.
Спектральный анализ – разложение сложного сигнала на некоторое множество
простых сигналов (колебаний) с целью определения интенсивности каждого колебания в этом сложном сигнале.
Электромагнитная интерференция (EMI) – это термин, применяемый к нежелательному излучению от преднамеренных и случайных излучателей.
GUI SPTool (Signal Processing Toolbox— средства обработки сигнала) – программа, разработанная на основе пакета расширения Signal Processing Toolbox и предназначенная для решения задач, связанных с моделированием цифровой фильтрации.
BPwin – программное средство для рисования диаграмм и в проверки целостности и согласованности модели[1].
ПС – программное средство.
ЦФ – цифровой фильтр.
ПФ – преобразование Фурье.
ДВРФ – дискретно-временной ряд Фурье.
БПФ – быстрое преобразование Фурье.
ДВП – дискретное вейвлет-преобразование.
др. – другое.
т.е. – то есть.
HAAR - вейвлет (вейвлет Хаара) - это короткое прямоугольное колебание на интервале [0,1].
FHAT - вейвлет («Французская шляпа» - French hat) – простейший вейвлет.
MHAT - вейвлет («Мексиканская шляпа» - Mexican hat) – симметричный
вейвлет, спектр которого представлен только действительной частью.
6
ВВЕДЕНИЕ
Электроэнцефалография (ЭЭГ) является одним из наиболее широко используемых методов для изучения деятельности головного мозга. Это неинвазивный метод
исследования, который основывается на регистрации электрической активности
мозга с помощью электродов, установленных на коже головы. Метод позволяет записывать электрическую активность мозга, что дает возможность анализировать нейрофизиологические показатели и выявлять патологии в функционировании мозга. Анализ ЭЭГ позволяет выявить наличие различных типов электрических потенциалов,
таких как альфа, бета, дельта, тета-волны, которые соответствуют различным состояниям мозга. Однако, для анализа сигналов, получаемых в ходе электроэнцефалографии, требуются специализированные методы, которые позволяют выделить специфические сигналы из общей электрической активности мозга.
Существует множество методов обработки и анализа сигналов ЭЭГ, которые используются для выявления различных электрофизиологических показателей и функциональных связей между различными областями мозга. Например, методы фильтрации, которые используются для извлечения сигналов из шума, методы анализа частоты, которые позволяют оценить спектральные характеристики сигнала, методы
временного анализа, которые позволяют оценить динамику электрической активности мозга во времени, и многие другие. Эти методы могут быть использованы для
изучения функциональных свойств мозга, а также для диагностики нарушений в работе нервной системы.
Кроме того, существуют методы машинного обучения и анализа данных, которые используются для автоматического анализа сигналов ЭЭГ и выявления характерных паттернов электрической активности мозга. Такие методы могут быть полезными
в различных областях, включая диагностику заболеваний, контроль за состоянием пациента и изучение мозговых процессов.
Среди специфических сигналов, которые могут быть выделены из сигналов ЭЭГ,
больший интерес представляют сигналы P300. Эти сигналы возникают в результате
стимуляции мозга и ассоциируются с процессами, связанными с вниманием, восприятием и принятием решений.
Каждый из этих методов имеет свои преимущества и ограничения, и часто они
используются в сочетании для получения более полной картины электрической активности мозга. Целью данной работы является создание программного средства по
обработке энцефалограмм, в частности, выявления сигнала Р300, для дальнейших выявлений патологий пациентов.
7
1 АНАЛИЗ МЕТОДОВ ВЫЯВЛЕНИЯ СИГНАЛОВ НА
ЭНЦЕФАЛОГРАММАХ
1.1 Общие методы выявления и обработки сигналов на энцефалограммах
1.1.1 Методы фильтрации
Шум представляет собой нежелательную компоненту сигнала, которая может
сильно повлиять на результаты анализа электроэнцефалограммы (ЭЭГ). Чтобы извлечь полезную информацию из сигнала, необходимо проводить фильтрацию, которая позволяет снизить влияние шума.
Существует несколько методов фильтрации, которые могут использоваться для
извлечения сигналов из шума. Один из наиболее распространенных методов - это
фильтр низких частот [1], который удаляет высокочастотный шум из сигнала. Этот
метод особенно полезен для извлечения сигналов, связанных с низкочастотной активностью мозга.
Еще одним методом фильтрации является фильтр высоких частот [2], который
удаляет низкочастотный шум из сигнала. Этот метод особенно полезен для извлечения сигналов, связанных с высокочастотной активностью мозга.
Кроме того, существуют методы, которые позволяют устранить артефакты, такие как движение глаз или мышечная активность, которые могут искажать сигнал.
Один из таких методов - это метод независимых компонент [3] (Independent
Component Analysis, ICA), который позволяет разделить сигнал на независимые компоненты, соответствующие различным источникам активности мозга.
Также существуют методы, которые позволяют учитывать не только шум, но и
другие искажения сигнала, такие как искажения, вызванные электромагнитными помехами. Один из таких методов - это метод адаптивной фильтрации [4] (Adaptive
Filtering), который позволяет адаптировать фильтр к изменяющимся условиям записи
сигнала.
Каждый из этих методов фильтрации может быть использован для извлечения
полезной информации из сигнала и снижения влияния шума. Кроме того, комбинация
различных методов фильтрации может быть эффективным способом повышения качества сигнала и улучшения результатов анализа ЭЭГ.
Во время фильтрации сигналов на ЭЭГ применяются различные методы, включая фильтрацию низких частот, фильтрацию высоких частот и фильтрацию зигзагообразного шума. Фильтрация низких частот используется для удаления постоянного
компонента сигнала, который может быть вызван медленными движениями глаз или
мускулатурой. Фильтрация высоких частот используется для удаления шумовых компонентов, вызванных быстрыми движениями глаз или электродвигателей.
Однако, зигзагообразный шум представляет большую сложность для удаления,
поскольку его частота находится в пределах диапазона частот интересующих нас сигналов. Для его удаления часто применяют фильтры Винера, а также метод независимой компонентной анализа (ICA).
Метод фильтрации Винера [5] основан на оценке спектра шума и сигнала, а
также на предположении, что сигнал и шум не коррелированы. Этот метод дает хо8
рошие результаты при работе с малошумными сигналами, но может быть менее эффективен при работе с сильношумными данными.
Таким образом, эффективная фильтрация сигналов является важным шагом при
анализе данных ЭЭГ.
1.1.2 Анализ частот
Анализ частоты является важным инструментом для оценки спектральных характеристик сигнала на энцефалограммах. Существует несколько методов анализа частоты, которые используются для изучения этих характеристик.
Один из таких методов - это преобразование Фурье [6]. Этот метод позволяет
разложить сигнал на составляющие частоты и определить, какие частоты присутствуют в сигнале и какой у них амплитудный спектр. Преобразование Фурье часто
используется для анализа спектральных характеристик в электроэнцефалографии
(ЭЭГ).
Еще один метод - это спектральный анализ [7]. Он позволяет изучать изменения
спектральных характеристик сигнала во времени. Этот метод широко используется
для изучения динамики сигналов во время выполнения различных задач.
Также существуют методы анализа волн, такие как вейвлет-анализ [8]. Этот метод позволяет разбить сигнал на составляющие волны, что позволяет изучать не
только спектральные, но и временные характеристики сигнала. Вейвлет-анализ широко применяется для изучения электроэнцефалографии в связи с возможностью исследования быстроменяющихся процессов.
Также методы анализа частоты могут использоваться вместе с другими методами фильтрации, что может улучшить качество извлекаемых сигналов и позволить
получить более точные данные о спектральных характеристиках энцефалограмм.
1.1.3 Методы временного анализа
Одним из наиболее распространенных методов временного анализа является
эпохальный анализ [9]. В этом методе электроэнцефалограмма (ЭЭГ) разбивается на
короткие сегменты, называемые эпохами. Каждая эпоха представляет собой запись
мозговой активности в течение определенного временного интервала, обычно от 100
до 1000 мс.
Затем проводится анализ каждой эпохи, чтобы определить, какие типы мозговой
активности присутствуют в каждой из них. Например, можно изучать амплитуды и
частоты волн, чтобы определить, какие типы ритмов присутствуют в каждой эпохе.
Этот метод позволяет исследовать динамику мозговой активности во времени и обнаруживать изменения в ответе мозга на различные стимулы.
Другим методом временного анализа является анализ событийного ряда. Этот
метод используется для изучения мозговой активности в ответ на конкретное событие, например, предъявление определенного стимула. Для этого ЭЭГ разбивается на
отдельные сегменты, соответствующие каждому событию, и проводится анализ каждого сегмента.
Один из способов анализа событийного ряда - это сравнение средней мозговой
активности в ответ на стимул с средней мозговой активностью в отсутствие стимула.
Это позволяет определить, какие типы мозговой активности изменяются в ответ на
9
стимул и какова их динамика во времени.
Также широко используются методы анализа фазовой связности, которые позволяют изучать синхронизацию между различными областями мозга во времени. Эти
методы позволяют исследовать взаимодействие между различными ритмами мозговой активности и определять, какие области мозга синхронизируются при выполнении определенных задач.
1.2 Методы выявления и обработки сигналов Р300 на энцефалограммах
Сигналы P300 - это позитивные компоненты энцефалограммы (ЭЭГ), которые
возникают при выполнении задач, требующих внимания и концентрации. Эти сигналы широко используются в исследованиях когнитивных процессов, а также в биомедицинских исследованиях, включая диагностику некоторых заболеваний, таких
как эпилепсия и шизофрения. Рассмотрим современные методы выявления сигналов
P300 на ЭЭГ.
1.2.1 Метод событийно-связанных потенциалов
Метод событийно-связанных потенциалов (ERP) [10] - это один из наиболее распространенных способов выявления сигналов P300 на энцефалограммах. Он основан
на регистрации электрической активности мозга в ответ на предъявление определенного стимула.
Принцип работы метода ERP заключается в том, что исследуемый подвергается
серии стимулов, которые могут быть как зрительными, так и аудио- или тактильными.
Обычно это серия однотипных стимулов, например, серия букв, цифр или звуков. В
ответ на каждый стимул мозг вырабатывает электрический потенциал, который регистрируется с помощью электродов, расположенных на поверхности головы.
Затем полученные сигналы анализируются с помощью специального программного обеспечения, которое позволяет выделить компоненты, соответствующие сигналам P300. Важно отметить, что этот метод требует достаточно длительного времени
на проведение исследования, так как для получения достоверных результатов необходимо проводить многократное повторение серии стимулов.
В целом, метод ERP является эффективным способом выявления сигналов P300,
поскольку позволяет достаточно точно определить время появления сигнала и оценить его амплитуду. Однако, он имеет и свои недостатки, например, малую устойчивость к шуму и низкую специфичность к сигналам P300, что может привести к возможным ошибкам в интерпретации результатов.
1.2.2 Методы машинного обучения
Методы машинного обучения [11] стали все более популярными в области выявления сигналов P300 на ЭЭГ. Эти методы используют алгоритмы, которые обучаются распознавать шаблоны P300 сигналов на основе различных признаков.
Один из таких методов - это метод классификации с использованием алгоритма
опорных векторов (SVM). Этот метод основан на идее построения гиперплоскостей в
многомерном пространстве, которые максимально разделяют классы данных. SVM
10
может использоваться для классификации сигналов P300 на основе различных признаков, таких как амплитуда, частота и время.
Еще один метод машинного обучения - это метод глубокого обучения, который
использует нейронные сети для анализа данных. Этот метод может использоваться
для выделения признаков из ЭЭГ данных, а затем для обучения модели, которая может распознавать шаблоны P300 сигналов.
Также в последнее время активно исследуются методы машинного обучения на
основе сверточных нейронных сетей (CNN), которые способны автоматически извлекать признаки из сигналов, что уменьшает необходимость вручную выбирать признаки для анализа.
В целом, методы машинного обучения являются мощными инструментами для
анализа данных ЭЭГ и выявления сигналов P300. Они могут улучшить точность распознавания P300 сигналов, что делает их более эффективными для использования в
различных приложениях, включая системы управления интерфейсом мозг-компьютер.
1.2.3 Сенсоры нового поколения
Сенсоры нового поколения [12], такие как электроды с высоким разрешением и
сенсоры, работающие на основе дополненной реальности, предоставляют новые возможности для получения сигналов P300 на ЭЭГ. Электроды с высоким разрешением
имеют более мелкий размер, чем традиционные электроды, что позволяет получать
более точные данные о распределении электрической активности мозга. Они также
могут быть размещены на мозге более плотно, что позволяет получать данные из более широких областей мозга.
Сенсоры, работающие на основе дополненной реальности, предоставляют новые
возможности для получения данных о сигналах P300. Они могут быть использованы
для создания виртуальных сред, которые могут быть приспособлены к индивидуальным потребностям пациента и обеспечивают более точные данные, чем традиционные методы. Сенсоры дополненной реальности также могут уменьшить влияние
окружающей среды на получение данных, таких как шум и артефакты, и повысить
удобство использования для пациента.
Одним из примеров сенсоров нового поколения являются электроды с высоким
разрешением, которые могут использоваться для получения данных о сигналах P300
в реальном времени и в более широких областях мозга. Сенсоры дополненной реальности, такие как Google Glass и Microsoft HoloLens, могут использоваться для создания виртуальных сред, которые могут быть настроены под индивидуальные потребности пациента, что позволяет получать более точные данные о сигналах P300.
Использование сенсоров нового поколения для получения данных о сигналах
P300 может улучшить точность диагностики неврологических заболеваний, таких как
болезнь Альцгеймера и болезнь Паркинсона, а также повысить эффективность терапии для этих заболеваний. Однако, необходимо проводить дополнительные исследования для оценки эффективности и безопасности использования сенсоров нового поколения в клинических условиях.
11
1.3 Программные средства обработки сигналов
В данный момент существует большое количество приложений для обработки
и анализа сигналов. Многие приложения предоставляют возможность анализа сигналов, используя различные алгоритмы. В данный момент уделяется большое внимание
разработке новых алгоритмов и совершенствованию уже существующих.
В данном разделе будет рассмотрено несколько программных средств, позволяющих анализировать сигналы.
1.3.1 MATLAB
Для работы с сигналами MATLAB предоставляет пакет Signal Processing
Toolbox.
Данный пакет предоставляет широкие возможности по созданию программ обработки сигналов для современных научных и технических приложений. В пакете
Signal Processing Toolbox используется разнообразная техника фильтрации и новейшие алгоритмы спектрального анализа. Пакет содержит модули для разработки новых алгоритмов обработки сигналов, разработки линейных систем и анализа временных рядов. Пакет может быть полезным в таких областях, как обработка аудио- и видеоинформации, телекоммуникации, геофизика, задачи управления в реальном режиме времени, экономика, финансы и медицина. Пакет Signal Processing является основой для решения многих других задач. Например, комбинируя его с пакетом Image
Processing, можно обрабатывать и анализировать двумерные сигналы и изображения.
В паре с пакетом System Identification пакет Signal Processing позволяет выполнять
параметрическое моделирование во временной области. В сочетании с пакетами Neural Network и Fuzzy Logic может быть создано множество средств для обработки данных или выделения классификационных характеристик.
Достоинством MATLAB является предоставление широкого выбора возможностей для анализа сигналов.
Например, для вейвлет анализа MATLAB предоставляет возможность использования следующих семейств вейвлетов:
- вейвлеты Хаара;
- вейвлеты Добеши;
- симлеты;
- койфлеты;
- биортогональные вейвлеты;
- дуальные биортогональные вейвлеты;
- вейвлеты Мейера;
- дискретные аппроксимации вейвлетов Мейера;
- гауссовы вейвлеты;
- вейвлет «мексиканская шляпа»;
- вейвлеты Морле;
- комплексные гауссовы вейвлеты;
- вейвлеты Шеннона;
- частотные В_сплайновые вейвлеты;
- комплексные вейвлеты Морле.
12
Недостатки:
- необходимо знать язык MATLAB для написания программы, которая будет обрабатывать сигналы требуемым образом;
- данное ПС является платным;
Рисунок 1.1 - Пример отображения сигнала в Matlab
1.3.2 GUI SPTool
Программа GUI SPTool (Signal Processing Toolbox— средства обработки сигнала) разработана на основе пакета расширения Signal Processing Toolbox и предназначена для решения следующих задач, связанных с моделированием цифровой фильтрации:
- синтез ЦФ;
- анализ ЦФ;
- импорт входного сигнала;
- моделирование цифровой фильтрации;
- анализ сигналов во временной области;
- анализ сигналов в частотной области;
- экспорт данных из GUI SPTool.
Достоинства:
- предоставляет возможность обработки сигналов;
- не требуется навыков программирования.
Недостатком данного ПС является то, что оно платное и не принимает формат
данных, получаемый от датчиков.
13
Рисунок 1.2 - Пример отображения сигнала в SPTool
1.3.3 P300-EDA
Реализация программного средства обнаружения волн P300, предложенного победителями соревнования BCI Competition III.
Оно был разработан для использования в системах BCI, которые основаны на
выявлении P300, одного из наиболее распространенных событийно-связанных потенциалов, возникающих в ЭЭГ.
Алгоритм использует адаптивную фильтрацию для устранения шума, а затем находит
в пиковых значениях потенциала, которые соответствуют временным отметкам, связанным с предъявлением стимула, входной сигнал, связанный с P300. Затем производится обучение на основе машинного обучения для построения модели, которая будет
использоваться для дальнейшего определения сигналов P300.
Данный алгоритм имеет высокую точность обнаружения P300-сигналов, что позволяет создавать эффективные системы BCI на их основе. Однако, он также требует
больших вычислительных ресурсов, что может стать проблемой при использовании
в реальном времени.
1.3.4 P300-speller
Проект «BCI-спеллер на основе обнаружения P300 с использованием архитектуры 1D CNN» посвящен изучению возможностей и ограничений интерфейсов мозгкомпьютер для облегчения коммуникации людей с повреждениями мозга. Методология, реализованная в данной работе, основана на создании моделей бинарной классификации для вызванных потенциалов (ERP), с помощью которых извлекается информация о написанном пациентом символе.
14
Рисунок 1.3 - Архитектура программного средства Р300-speller
1.4 Постановка задачи
Разработать десктоп приложение для применения методов выявления и обработки сигналов на энцефалограммах.
Программное средство должно:
- иметь графический интерфейс взаимодействия;
- выполнять загрузку исходных данных из файла;
- выполнять выгрузку обработанных данных в файл;
- показывать исходный сигнал на графике;
- выполнять преобразование Фурье;
- выводить результаты преобразования Фурье на график;
- выполнять очистку сигнала с использованием фильтра Баттерворта;
- выполнять поиск корреляции сигналов;
- выявлять сигналы Р300 на временной ленте.
Формат принимаемых на вход программы файлов должен быть следующим:
- Программа должна принимать на вход файлы с расширением .mat;
- Массив Signal с измерениями (Signal samples, EEG channels, Testset letters), где
Signal samples- индекс каждого i-го сигнала, EEG channels – индекс канала для снятия
энцефалограммы, Testset letters – буква, которая была показана подопытному;
- Массив Flashing, состоящий из 1 и 0 и ставящий в соответствие каждому моменту времени фиксации сигнала с ЭЭГ единицу, если в этот момент была показана
буква, и 0 в противном случае;
- Stimulis code – массив, ставящий в соответствие каждому моменту времени
фиксации сигнала с ЭЭГ код стимула;
15
2 МАТЕМАТИЧЕСКИЕ СПОСОБЫ ОБРАБОТКИ ЦИФРОВЫХ
СИГНАЛОВ
2.1 Преобразование Фурье
Для преобразования сигнала из временного представления в частотное и наоборот используется преобразование Фурье. В теории для преобразования из временного
представления в частотное, требуется рассматривать все значения амплитуд, то есть
бесконечное их множество на промежутке времени от минус бесконечности до плюс
бесконечности. На практике же берется конечный промежуток времени и для него
применяется преобразование Фурье. В данном разделе будет рассмотрено несколько
подходов данного преобразования.
Рисунок 2.1 - Временное и частотное представления сигналов
16
В основе преобразования Фурье (ПФ) лежит следующая идея – почти любую периодическую функцию можно представить суммой отдельных гармонических составляющих (синусоид и косинусоид с различными амплитудами A, периодами Т и, следовательно, частотами ω). Пример одной из таких функций S(t), состоящей из гармоник Сi(t), приведен на рисунке 2.1[11].
Для начала рассмотрим преобразование Фурье для непрерывного во времени
сигнала:
+∞
𝑋(𝑓) = ∫−∞ 𝑥(𝑡) ∙ 𝑒 −𝑗2𝜋𝑘𝑡 𝑑𝑡,
(2.1)
которое идентифицирует частоты и амплитуды тех комплексных синусоид (экспонент), на которые разлагается некоторое произвольное колебание.
Обратное преобразование выглядит следующим образом:
+∞
𝑥(𝑡) = ∫−∞ 𝑋(𝑓) ∙ 𝑒 −𝑗2𝜋𝑘𝑡 𝑑𝑓.
(2.2)
Но на практике на вход обрабатывающей программы подаются не непрерывные
во времени сигналы, а дискретные. Следовательно, надо использовать дискретное
преобразование Фурье. Также прямое и обратное преобразование будет выполняться
не для бесконечного промежутка времени, а для конечного отрезка.
Формула для прямого дискретного преобразования Фурье выглядит следующим образом:
−𝑗
𝑋(𝑓) = ∑𝑁−1
𝑡=0 𝑥(𝑡) ∙ 𝑒
2𝜋𝑘𝑡
𝑁
,
(2.3)
Соответственно для обратного преобразования:
𝑗
𝑥(𝑡) = ∑𝑁−1
𝑡=0 𝑋(𝑓) ∙ 𝑒
2𝜋𝑘𝑡
𝑁
.
(2.4)
Выполнение расчетов по формулам 2.3 и 2.4 занимает достаточно продолжительное время, поэтому разрабатываются методы ускорения преобразования Фурье.
Далее будут рассмотрены некоторые из них.
Еще задолго до появления компьютеров было предложено несколько эффективных вычислительных схем, позволяющих существенно сократить число вычислительных операций, настоящую революцию произвела публикация в 1965 году статьи
Кули (Cooly) и Тьюки (Tukey) c практическим алгоритмом быстрого (число операций
Nlog2N) вычисления ДВРФ. После этого было разработано множество вариантов,
усовершенствований и дополнений основной идеи, составивших класс алгоритмов,
известных под названием быстрого преобразования Фурье. Основная идея БПФ - деление N-точечного ДВРФ на два и более ДВРФ меньшей длины, каждый из которых
можно вычислить отдельно, а затем линейно просуммировать с остальными, с тем
чтобы получить ДВРФ исходной N-точечной последовательности.
17
Представим дискретное преобразование Фурье (ДВРФ) в виде
𝑋(𝑘) =
1
𝑁
𝑛𝑘
∑𝑁−1
𝑛=0 𝑥(𝑛)𝑊𝑁 ,
(2.5)
2𝜋
где величина 𝑊𝑁 = 𝑒 −𝑗 𝑁 носит название поворачивающего множителя.
Суть быстрого алгоритма Фурье сводиться к итерационному разделению последовательности на последовательности с четными и нечетными номерами, вычислению их составляющих и последующему сложению [12].
2.2 Фильтр Баттерворта
Фильтр Баттерворта - это тип фильтра, используемый в цифровой обработке
сигналов, который позволяет пропускать или подавлять определенные частоты входного сигнала. Он относится к классу фильтров с конечной импульсной характеристикой (Finite Impulse Response, FIR). Фильтр Баттерворта обладает равной амплитудночастотной характеристикой в его полосе пропускания, что означает, что амплитуда
сигнала в этой полосе не искажается. Он также имеет плавный переход между полосой пропускания и полосой заграждения, что уменьшает искажение сигнала на границе полос.
Функционирование фильтра Баттерворта основано на изменении амплитуды
сигнала в зависимости от частоты. Входной сигнал проходит через фильтр, который
состоит из параллельно соединенных резонансных цепей (каждая из которых представляет собой RC-цепь), и затем выходит из фильтра. В зависимости от настроек
фильтра, частоты выше или ниже определенной точки (называемой частотой среза)
будут подавлены.
Для настройки фильтра Баттерворта необходимо задать несколько параметров:
порядок фильтра, частоту среза, тип фильтра (низкочастотный или высокочастотный). После настройки фильтра он может быть применен к входному сигналу для получения отфильтрованного сигнала с уменьшенным шумом и сглаженными переходами между участками с разной частотой.
Существует два типа фильтров Баттерворта: фильтр низких частот Баттерворта
и фильтр высоких частот Баттерворта.
Фильтр низких частот Баттерворта (Butterworth low-pass filter) – пропускает
низкочастотные сигналы и подавляет высокочастотные сигналы. Фильтр высоких частот Баттерворта (Butterworth high-pass filter) - пропускает высокочастотные сигналы
и подавляет низкочастотные сигналы. Оба типа фильтров являются типами фильтров
непрерывного времени и могут быть реализованы как аналоговые, так и цифровые
фильтры.
Bandpass Butterworth filter - это фильтр Баттерворта с полосовым характером,
который пропускает определенный диапазон частот сигнала, а остальные частоты подавляет. Он представляет собой комбинацию низкочастотного и высокочастотного
фильтров Баттерворта и обычно используется для извлечения определенных частотных компонентов из сигнала. Например, при анализе электроэнцефалограммы (ЭЭГ)
18
он может быть использован для фильтрации шумов и артефактов, оставляя только
интересующие частоты, связанные с определенными мозговыми активностями.
В зависимости от требований к обработке сигнала, можно выбрать различные
типы фильтров. Например, фильтр Чебышева I/II типа или эллиптический фильтр может быть выбран для обеспечения большей степени подавления шума, но при этом
могут возникнуть проблемы с фазовым сдвигом.
В свою очередь, фильтр Баттерворта представляет собой альтернативу, которая
имеет более линейный фазовый отклик в полосе пропускания. Хотя у фильтра Баттерворта может быть более медленный спад, чем у фильтра Чебышева I/II или эллиптического фильтра, это не является серьезным недостатком. Для достижения определенных характеристик полосы задержки может потребоваться более высокий порядок
фильтра Баттерворта.
Как и все фильтры, типичным прототипом является фильтр низких частот, который может быть изменен на фильтр высоких частот или размещен в серии с другими, чтобы образовать полосовой фильтр или режекторный фильтр, а также более
высоких порядков версий этих фильтров.
Усиление G n-ого порядка фильтра Баттерворта в виде передаточной функции
H(s) выражается следующим образом:
,
(2.6)
Здесь n - порядок фильтра, 𝜔𝑐 - частота среза (приблизительно частота -3 дБ), а
𝐺𝑜 - коэффициент усиления на нулевой частоте.
Можно заметить, что по мере приближения n к бесконечности, коэффициент
усиления становится прямоугольной функцией, и частоты ниже 𝜔𝑐 будут передаваться с коэффициентом усиления 𝐺𝑜 , а частоты выше 𝜔𝑐 будут подавляться. Для
меньших значений n срез будет менее резким.
Рисунок 2.1 – График АЧХ из статьи Баттерворта 1930 года
19
Свойства фильтра Баттерворта:
- Монотонная АЧХ как в полосе пропускания, так и в полосе задержки;
- Быстрое спадание в окрестности частоты среза, которое улучшается с
увеличением порядка фильтра;
- Значительное перерегулирование и колебания в переходной характеристике, которые ухудшаются с увеличением порядка фильтра;
- Несколько нелинейная фазовая характеристика;
- Групповая задержка сильно зависит от частоты;
Ниже приведено изображение, показывающее усиление дискретного фильтра
Баттерворта, рядом с другими распространенными типами фильтров. Все эти фильтры имеют пятый порядок.
Рисунок 2.2 – усиление дискретного фильтра Баттерворта рядом с другими
распространенными типами фильтров.
Фильтр Баттерворта отклоняется от передаваемого сигнала медленнее в окрестности частоты среза, чем фильтры Чебышева или Эллиптический фильтр, но без ряби.
2.3 Корреляционный анализ
Для выявления зависимости между сигналами используется корреляционный
анализ.
20
Корреляционный анализ - это метод исследования статистических взаимосвязей между двумя или более переменными. Существует несколько видов корреляционного анализа, включая:
- Пирсона корреляция: Оценка линейной взаимосвязи между двумя непрерывными переменными.
- Ранговая корреляция: Оценка связи между двумя переменными на основе их
ранговых порядков, а не их фактических значений.
- Спирмен корреляция: Оценка связи между двумя переменными на основе их
ранговых порядков, но с использованием другого коэффициента, чем в ранговой корреляции.
- Корреляционный анализ для номинальных переменных: Оценка связи между
двумя номинальными переменными с использованием коэффициента Крамера.
- Частная корреляция: Оценка связи между двумя переменными, контролируя
влияние других переменных.
Выбор подходящего метода корреляционного анализа зависит от многих факторсов, включая:
- Тип данных: В зависимости от типа данных, с которыми вы работаете, один
метод корреляционного анализа может быть более подходящим, чем другой. Например, для непрерывных переменных можно использовать Пирсона корреляцию, в то
время как для ранговых переменных лучше использовать ранговую корреляцию.
- Цель исследования: Ваша цель исследования также может повлиять на выбор
метода корреляционного анализа. Например, если вы хотите определить, есть ли
связь между двумя переменными в пределах определенных значений других переменных, вам может понадобиться использовать частную корреляцию.
- Количество переменных: Количество переменных, которые вы хотите исследовать, также может влиять на выбор метода корреляционного анализа. Если вы хотите исследовать связь между более чем двумя переменными, может потребоваться
использовать множественную корреляцию.
- Распределение данных: Если ваши данные не распределены нормально, то может быть необходимо использовать методы корреляционного анализа, которые не основаны на нормальном распределении, такие как ранговая корреляция.
Суть корреляционного анализа сводится к вычислению суммы произведений
соответствующих пар точек сигналов. Если рассматривать в качестве анализируемых
сигналов две независимые и случайные последовательности данных, то сумма произведений будет стремиться к нулю. Это можно объяснить тем, что вероятность встретить какое-либо число в последовательности одинакова для всех чисел последовательности. Следовательно, пары произведений компенсируются при сложении. Но,
если сумма чисел не стремится к нулю, то это указывает на наличие зависимости
между данными. Если сумма положительна, то будет присутствовать положительная
корреляция, то есть при увеличении одного параметра, растет другой. Если сумма отрицательна, то будет присутствовать отрицательная корреляция, то есть при увеличении одного параметра, другой параметр будет уменьшаться. Таким образом, взаимную корреляцию двух последовательностей данных, содержащих по N элементов,
можно записать следующим образом:
21
𝑃1,2 = ∑𝑁−1
𝑖=0 𝑥1 (𝑖) ∙ 𝑥2 (𝑖) ,
(2.8)
Но описание взаимной корреляции по формуле 2.8 зависит от количества взятых точек. Следовательно, необходимо нормировать результат. Этого можно достичь,
разделив полученный результат на количество входных точек. Таким образом мы
приходим к формуле 2.9. [14]
𝑃1,2 =
1
𝑁
∑𝑁−1
𝑖=0 𝑥1 (𝑖) ∙ 𝑥2 (𝑖) ,
(2.9)
На практике для построения функции корреляционной зависимости между
двумя сигналами применяется следующая формула:
𝑃1,2 (𝑗) =
1 𝑁−1
∑
𝑥 (𝑖)∙𝑥2 (𝑖+𝑗)
𝑁 𝑖=0 1
1
𝑁−1 2
2
√∑𝑁−1
𝑖=0 𝑥1 (𝑖)∙∑𝑖=0 𝑥2 (𝑖+𝑗)
𝑁
,
(2.10)
В знаменателе формулы 2.8 стоит нормализующий коэффициент, который приводит область значения результирующей функции 𝑃1,2 (𝑗) к диапазону [-1;1]. Смысл
этой формулы заключается в выделении окна размером N в сигнале 1 и последовательном сравнении этого окна с соответствующими по длине окнами сигнала 2. Если
𝑃1,2 (𝑗) = 1, то это будет говорить о том, что сигналы в выделенных окнах идентичны.
Если выделить окно в сигнале 1 и двигать его по этому же сигналу, то формула
8 приобретет следующий вид:
𝑃1,1 (𝑗) =
1 𝑁−1
∑
𝑥 (𝑖)∙𝑥1 (𝑖+𝑗)
𝑁 𝑖=0 1
,
1
𝑁−1 2
2
√∑𝑁−1
𝑖=0 𝑥1 (𝑖)∙∑𝑖=0 𝑥1 (𝑖+𝑗)
𝑁
(2.11)
Нахождение зависимости во втором случае (формула 2.11) будет называться автокорреляцией. Проведение автокорреляционного анализа позволяет находить длину
периода сигнала.
2.4 Поиск сигналов Р300 на энцефалограмме
Поиск сигналов Р300 на энцефалограмме (ЭЭГ) является методом анализа электрофизиологической активности мозга. Сигнал Р300 - это позитивный компонент, который возникает в ЭЭГ в ответ на стимул, который является неожиданным или требует внимания испытуемого. Он обычно появляется спустя 300 мс после стимула и
может использоваться для изучения процессов внимания и памяти у человека.
Поиск сигналов Р300 включает в себя обработку энцефалограммы, чтобы выделить этот сигнал из фона активности мозга. Это может быть сделано с помощью различных методов, включая фильтрацию, сегментацию и выделение признаков. В результате получается временная последовательность, которая может быть использована для изучения свойств процессов внимания и памяти у человека.
Рассмотрим каждый этап более подробно:
22
Фильтрация - процесс подготовки сигнала путем удаления помех и других нежелательных компонентов. Фильтрация может включать использование различных методов, таких как фильтры низких или высоких частот, фильтры Баттерворта, фильтры
Калмана и др. В контексте поиска сигналов Р300 наиболее часто используется фильтр
Баттерворта, который обеспечивает максимально плоский спектральный отклик в полосе пропускания.
Сегментация - процесс разделения сигнала на отдельные компоненты или сегменты, которые могут быть более легко анализированы. В случае поиска сигналов
Р300 наиболее важна сегментация, которая позволяет разбить сигнал на неперекрывающиеся временные интервалы, в которых можно искать появление Р300. Для этого
часто используется разбиение сигнала на окна фиксированной длины, которые могут
перемещаться по сигналу с заданным шагом.
Выделение признаков - процесс извлечения информации из сегментов сигнала,
которая может быть использована для классификации наличия или отсутствия сигналов Р300. В качестве признаков могут быть использованы различные характеристики,
такие как амплитуда, длительность, скорость нарастания и др. Для поиска сигналов
Р300 наиболее часто используются два признака: амплитуда и временная задержка
между стимулом и появлением сигнала Р300.
Поиск Р300 с использованием среднеквадратического отклонения - это один из
методов обнаружения Р300-волн в ЭЭГ сигналах. Сначала производится фильтрация
ЭЭГ сигнала, чтобы удалить шумы и артефакты, и применяется сегментация, чтобы
разбить сигнал на фрагменты определенной длины. Затем в каждом сегменте вычисляется среднее значение амплитуды в заданном временном окне.
Среднеквадратическое отклонение (standard deviation) определяется как квадратный корень из суммы квадратов отклонений каждой точки от среднего значения в
данном окне, деленный на количество точек. Значение среднеквадратического отклонения используется для оценки изменчивости сигнала в заданном окне.
В результате, если амплитуда Р300-волны превышает установленный порог, то
считается, что эта волна была обнаружена. Порог может быть определен как несколько среднеквадратических отклонений от среднего значения амплитуды в окне.
Этот метод поиска Р300 с использованием среднеквадратического отклонения
является относительно простым и быстрым, но может давать ложные срабатывания в
случае наличия сильных артефактов или шумов в сигнале. Поэтому обычно используются более сложные методы, такие как вейвлет-анализ для улучшения точности обнаружения Р300-волн.
В целом, поиск сигналов Р300 на электроэнцефалограмме - это задача сложной
обработки сигнала, которая включает в себя несколько этапов. Каждый из этих этапов
является важным для получения высокой точности и эффективности поиска сигналов
Р300.
23
3 РАЗРАБОТКА СТРУКТУРЫ И СХЕМЫ ПРОГРАММЫ
3.1 Спецификация требований
Разрабатываемое программное средство должно позволять анализировать
наборы входящих сигналов.
1) Принимаемые форматы.
a) Программа должна принимать на вход файлы с расширением .mat следующего содержания:
- массив Signal, измерения которого (Signal samples, EEG channels, Testset
letters), где Signal samples- индекс каждого i-го сигнала, EEG channels – индекс канала для снятия энцефалограммы, Testset letters – буква, которая была
показана подопытному;
- массив Flashing, состоящий из 1 и 0 и ставящий в соответствие каждому
моменту времени фиксации сигнала с ЭЭГ единицу, если в этот момент была
показана буква, и 0 в противном случае;
- Stimulis code – массив, ставящий в соответствие каждому моменту времени фиксации сигнала с ЭЭГ код стимула;
- Target char – массив, ставящий в соответствие каждому моменту времени.
b) Пользователь должен иметь возможность выбирать требуемые файлы.
c) Выбор сигнала обеспечивается нажатием левой кнопкой мыши на кнопку
«Load signal». Далее в открытом окне следует выбрать файл для загрузки.
2) Корреляционный анализ.
a) Начальные установки для корреляционного анализа.
- Пользователь выбирает график для анализа при помощи нажатия правой
кнопкой мыши на свободную область окна и выбора пункта «Выбрать сигнал»;
- В открывшемся диалоговом окне указывается исходный график для анализа и начальные и конечные координаты анализируемого отрезка;
- Выбрать график для анализа также можно сделать двойным щелчком
мыши по нему. Начальная координата для анализа устанавливается в точке,
где была нажата левая кнопка мыши, а конечная там, где она была отпущена;
b) Собственно корреляционный анализ
- После выбора начальных установок, и запуска анализатора, программа
по очереди анализирует оставшиеся графики (корреляционный анализ)
- Для каждого графика находятся наиболее похожие отрезки. Наиболее
близкий отрезок находится по максимуму функции корреляции. Для выбранного значения определяется начальная координата x (время) и задержка относительно выбранного графика.
c) Представление результатов корреляционного анализа.
- Для каждого графика показывается соответствующая функция корреляции.
- На вкладке с результатами выводится отчет, который должен содержать
24
следующие данные: номер анализируемого графика, начальная и конечные
координаты, значение функции корреляции, для выбранного графика задержка будет равна 0.
3) Отображение сигналов на графике.
Отображение сигнала на графике будет осуществляться в 2 этапа: загрузка
сигнала и отображение сигнала
a) Загрузка сигнала.
Загрузка сигнала осуществляется кнопкой «Load Signal», после нажатия
на кнопку пользователь должен выбрать определенный сигнал в появившемся
окне
b) Отображение загруженного сигнала
Отображение осуществляется нажатием кнопки «Show plot». После нажатия кнопки «Show plot» должен быть показан график зависимости амплитуды
сигнала от времени. Ползунок, расположенный под графиком сигнала, должен позволять перемещаться по временной ленте и просматривать определенный участок сигнала.
4) Поиск сигналов Р300.
a) По нажатию на кнопку «Find P300» пользователь должен получить отчет
о том, в какие временные промежутки появлялся сигнал P300.
b) Метрика True positives должна быть не менее 0.9, False Positives не бо
лее 0.1, True negatives не менее 0.5, False negatives не более 0.5. Метрика Accuracy должна быть более 0.8.
c) Отчет должен иметь вид таблицы, в которой каждому временному окну
ставится в соответствие наличие или отсутствие сигнала Р300.
5) Фильтрация Баттерворта (high-pass)
a) High-pass Фильтрация Баттерворта должна осуществляться нажатием
кнопки «Apply high-pass Butterworth filtering».
b) Фильтрация должна начинаться с выбора пути сохранения отфильтро
ванного сигнала.
c) Далее программа должна отфильтровать сигнал и сообщить об этом
пользователю.
d) Результатом фильтрации должен быть отфильтрованный сигнал, сохра
ненный по выбранному ранее пути.
6) Фильтрация Баттерворта (low-pass)
a) Low-pass Фильтрация Баттерворта должна осуществляться нажатием
кнопки «Apply low-pass Butterworth filtering».
b) Фильтрация должна начинаться с выбора пути сохранения отфильтро
ванного сигнала.
c) Далее программа должна отфильтровать сигнал и сообщить об этом
пользователю.
Результатом фильтрации должен быть отфильтрованный сигнал, сохраненный
по выбранному ранее пути.
25
3.2 Use Case – диаграмма
Для получения как можно большего количества информации из набора сигналов, следует провести их визуальный, частотный анализы, а также подвергнуть обработке фильтрами. Для получения информации о наличии или отсутствии сигналов
Р300 требуется применить методы поиска данных артефактов, изложенные в разделе
два.
Таким образом, пользователь должен иметь возможность загружать выбранные
сигналы или группы сигналов. Просматривать их во временном и частотном представлении, иметь возможность проведения корреляционного анализа загруженных
сигналов, в случае необходимости искать сигналы Р300. Также следует предусмотреть возможность сохранения результатов анализа. Все вышеперечисленное можно
представить на Use Case – диаграмме, которая показана на рисунке 3.1.
Итак, пользователю должны быть доступны следующие функции:
- выбор и загрузка исходного сигнала;
- отображение сигнала во временном представлении;
- отображение сигнала в частотном представлении;
- проведение корреляционного анализа;
- проведение high-pass фильтрации;
- проведение low-pass фильтрации;
- поиск сигналов Р300;
- сохранение результатов в файл.
Рисунок 3.1 - Use Case – диаграмма
26
Рисунок 3.2 – Контекстная диаграмма
Рисунок 3.3 – Функциональная модель
27
Для структурирования данных полученных из спецификации требований и Use
Case – диаграммы разработаем модель программы в среде BPWin. Полученные диаграммы представлены на рисунках 3.2 и 3.3.
3.4 Схема программы
Схема программы (или блок-схема) используется для визуализации логики и последовательности выполнения алгоритма программы. Она представляет собой графическое изображение, в котором блоки представляют определенные действия, а
стрелки - направление выполнения программы. С помощью схемы программы разработчик может легко проверить, правильно ли он представил логику программы, и
увидеть возможные ошибки или улучшения в работе программы.
Блок-схемы могут иметь различные формы и стили, но обычно состоят из стандартных графических элементов, таких как прямоугольники, ромбы, эллипсы и
стрелки. Каждый элемент блок-схемы представляет определенную операцию или
действие в программе. Вот некоторые типичные элементы блок-схем:
- Прямоугольник: обозначает действие, которое должно быть выполнено, например, чтение данных, запись данных или выполнение математической операции.
- Ромб: обозначает условие или логическое выражение, например, «Если X
больше Y, то выполнить действие А, иначе выполнить действие B».
- Эллипс: обозначает начало и конец программы или подпрограммы.
- Стрелки: указывают направление выполнения программы.
- Схемы программы также могут использоваться для обучения начинающих программистов и студентов основам программирования, так как они позволяют легче понять и запомнить основные конструкции программирования и их последовательность. Они также могут использоваться для коммуникации между разработчиками и
другими членами команды, чтобы согласовать логику и функциональность программы.
Для наглядного представления планируемой последовательности действий выполняемой программой в этом разделе будет приведена схема алгоритма разрабатываемого программного средства.
Поскольку разрабатываемое программное средство должно позволять выбирать
и загружать исходный сигнал, отображать сигнал во временном представлении, отображать сигнал в частотном представлении, проводить корреляционный анализ, проводить high-pass фильтрацию, проводить low-pass фильтрацию, проводить поиск сигналов Р300 и сохранять результаты в файл, то схема программы должна выглядеть
так, как показано на рисунках 3.4 и 3.5.
После запуска программы для пользователя доступны все функции, однако для
их использования нужно предварительно загрузить сигнал. В случае если пользователь не имеет нужды использовать программное средство он может выйти из него
путем нажатия иконки Х в левом верхнем углу открывшегося окна приложения. Интерфейс приложения выполнен в минималистическом стиле и является простым и интуитивно понятным для использования.
28
Рисунок 3.4 – Общая схема работы приложения
29
Рисунок 3.5 – Общая схема работы приложения, продолжение
30
Пользователь программы для обработки сигналов имеет возможность ввести
определенные параметры для проведения фильтрации сигнала. В частности, для применения высокочастотной и низкочастотной фильтрации Баттерворта пользователю
необходимо указать значения гиперпараметров: порядок фильтра и частоту среза
фильтрации. Это позволяет пользователю получать результаты обработки, соответствующие его требованиям и задачам. Благодаря возможности ввода параметров для
фильтрации, пользователь может настроить обработку сигнала под свои конкретные
нужды и получить наилучший результат.
Перед тем, как программа начнет отображать график во временном представлении, пользователю будет предложено ввести порядковый номер буквы и порядковый номер канала записи электроэнцефалограммы. Это позволит пользователю получить максимально точные и релевантные результаты анализа.
Если пользователь заинтересован в просмотре нескольких сигналов для разных
букв, он может ввести порядковые номера всех интересующих его букв через запятую. Таким образом, программа сможет вывести все необходимые результаты анализа, что обеспечит пользователю удобство и высокую точность данных.
Кроме того, возможность выбора нескольких букв позволит пользователям
легко сравнивать данные и наблюдать различия между ними. Это может быть полезно
в случае, если пользователь занимается научными исследованиями или же использует
электроэнцефалограмму для медицинских целей. В целом, ввод порядковых номеров
букв и каналов записи электроэнцефалограммы является важной частью процесса
анализа данных, поскольку это позволяет получить наиболее точные и качественные
результаты. И благодаря простоте и удобству использования программы, пользователи смогут максимально эффективно работать с данными и достигать своих целей.
Программа анализирует все сигналы на основе предоставленных параметров
анализа, выводит графики корреляционных функций, рассчитывает и выводит относительные задержки между сигналами. После выполнения анализа, становится доступным последнее действие – сохранение результатов. Пользователь может вызвать
сохранение результатов из главной вкладки и из вкладки результатов. После сохранения пользователь может выполнить любое доступное ранее действие или выйти из
программы.
Программа является мощным инструментом для анализа сигналов. Она анализирует все сигналы на основе предоставленных параметров анализа и выводит графики корреляционных функций, что позволяет пользователю визуально оценить результаты анализа. Но это еще не все. Программа также рассчитывает и выводит относительные задержки между сигналами, что может быть крайне полезно при изучении
временных связей между различными сигналами.
После выполнения анализа пользователь может сохранить результаты, чтобы в
дальнейшем иметь возможность быстро и удобно повторно получить доступ к ним.
Для этого достаточно вызвать функцию сохранения результатов из главной вкладки
или из вкладки результатов. После сохранения пользователь может выполнить любое
доступное ранее действие или выйти из программы. Таким образом, программа
предоставляет удобный и многофункциональный инструмент для анализа и работы с
сигналами.
31
4 РАЗРАБОТКА АЛГОРИТМОВ И ПРОГРАММНОГО КОДА
В третьей главе была разработана схема программного средства. В данной главе
будут подробно рассмотрены алгоритмы, необходимые для данного программного
средства.
Таким образом, будут рассмотрены алгоритмы для реализации следующего
функционала:
- варианты загрузки сигналов;
- возможные виды отображения сигналов;
- проведение корреляционного анализа;
- проведение фильтрации;
- проведение анализа с преобразованием Фурье;
- сохранение результатов некоторых вычислений, полученных при проведении
корреляционного анализа.
4.1 Разработка алгоритмов для загрузки сигналов
Разрабатываемое программное средство должно позволять загружать сигналы
как по одному, так и группой (2 сигнала для корреляционного анализа). Таким образом, необходимы две функции:
- «Загрузить сигнал»;
- «Загрузить группу».
Рисунок 4.1 - Загрузить сигнал
32
Рисунок 4.2 - Загрузка сигналов
Данные функции показаны на рисунке 4.1 и 4.2 и будут рассмотрены подробнее
далее. После загрузки сигналов из файлов, они сохраняются в памяти программы для
дальнейшей обработки. Отображаются на графике при помощи процедуры «Show
Signal». Данный алгоритм позволяет пользователю загружать данные до тех пор, пока
он не решит приступить к дальнейшим действиям, а именно:
- пользователь может загрузить группу сигналов;
- пользователь может загружать сигналы по одному, выбирая при этом окно, в
которое он хочет загрузить выбранный сигнал;
- пользователь может загрузить сначала группу сигналов, а потом вместо некоторых сигналов из группы загрузить другие сигналы;
- при загрузке сигналов по одному и выборе несколько раз одного и того же окна
для загрузки, пользователь в выбранном окне получит последний загруженный сигнал.
- при загрузке нового сигнала предыдущий сигнал будет стерт из памяти программы.
33
Загружаемый сигнал находится в бинарном файле с расширением .mat. Файлы
с расширением .mat являются файлами данных, используемыми в программном обеспечении MATLAB. Они содержат переменные MATLAB, которые могут быть сохранены и загружены в любой момент времени. Файлы .mat могут содержать различные
типы данных, такие как числа, матрицы, векторы, структуры, ячейки и т.д.
Данные в файле .mat могут быть сохранены в двух форматах: в формате текста
или в двоичном формате. Файлы .mat в текстовом формате легко читаются человеком,
но они могут занимать больше места на жестком диске, чем файлы в двоичном формате. Файлы .mat в двоичном формате, напротив, занимают меньше места на жестком
диске, но их сложнее прочитать человеком.
Файлы .mat используются для сохранения данных, которые могут быть использованы повторно, например, результатов вычислений в MATLAB или данных из экспериментов, Также используются для передачи данных между программами, работающими с данными в MATLAB.
Загружаемый файл будет содержать 4 массива: массив Signal, массив Flashing,
Stimulis code, Target char. Массив Signal имеет представление (Signal samples, EEG
channels, Testset letters), где Signal samples- индекс каждого i-го сигнала, EEG channels
– индекс канала для снятия энцефалограммы, Testset letters – буква, которая была показана подопытному. Массив Flashing состоит из 1 и 0 и ставит в соответствие каждому моменту времени фиксации сигнала с ЭЭГ единицу, если в этот момент была
показана буква, и 0 в противном случае. Stimulis code – массив, ставящий в соответствие каждому моменту времени фиксации сигнала с ЭЭГ код стимула. Target char –
массив, ставящий в соответствие каждому моменту времени.
Данные массивы содержат информацию, полученную в ходе нейрофизиологического эксперимента. Все эти массивы представляют ценную информацию для исследования когнитивных процессов в человеческом мозге.
4.2 Разработка алгоритмов для проведения корреляционного анализа
После загрузки сигналов при помощи функции «Загрузить группу», можно
начинать анализ загруженных сигналов. Функция «Загрузить группу» активируется
сразу после нажатия кнопки «Find correlations». Затем для проведения корреляционного анализа сначала необходимо задать начальные параметры:
- начальную координату окна;
- конечную координату окна.
Далее проводится расчет корреляционных функций для загруженных сигналов.
После расчета корреляционных функций находятся временные задержки между сигналами и строятся графики корреляционных функций для заданных сигналов.
Таким образом, для более удобного представления алгоритма корреляционного
анализа, разделим его на отдельные этапы и представим их последовательно.
Сначала перечислим выделенные этапы:
- установка начальных параметров;
- вычисление корреляционных функций;
- вычисление задержек сигналов;
- отображение графиков корреляционных функций.
34
Установка параметров состоит из трех действий, как показано на рисунке 4.5.
Рисунок 4.5 - Установка начальных параметров
После выбора начальных параметров вычисляется функция корреляции для
каждого из сигналов по следующей формуле:
𝑃1,2 (𝑗) =
∑𝑁−1
𝑖=0 𝑥1 (𝑖)∙𝑥2 (𝑖+𝑗)
𝑁−1 2
2
√∑𝑁−1
𝑖=0 𝑥1 (𝑖)∙∑𝑖=0 𝑥2 (𝑖+𝑗)
,
(4.1)
Где:
- 𝑃1,2 (𝑗) - функция корреляции;
- N – размер окна, равный разности конечной и начальной координат, определенных ранее;
- 𝑥1 (𝑖) − функция, полученная из выбранного сигнала;
- 𝑥2 (𝑖 + 𝑗) − соответствующие окна у обрабатываемых сигналов.
35
2
Поскольку делитель √∑𝑁−1
𝑖=0 𝑥1 (𝑖) зависит только от выбранного окна и не ме-
няется со временем, то его следует посчитать отдельно и использовать результат вычислений в дальнейших расчетах для всех сигналов. При выборе другого окна для
анализа, данный делитель следует пересчитать.
На рисунке 4.6 показан алгоритм расчета корреляционной функции для одного
сигнала.
После того, как программа производит расчет корреляционных функций для
всех графиков, происходит важный этап - расчет задержек всех графиков относительно выбранного. Этот процесс включает в себя вычисление разницы между координатой анализируемого графика, имеющей максимальное значение функции корреляции, и начальной координатой окна, установленной пользователем. Таким образом,
для выбранного графика рассчитанная задержка должна быть равной нулю, что является важным критерием качества анализа.
После того, как задержки рассчитаны, программа предоставляет пользователю
подробную информацию об относительных задержках между всеми графиками. Эта
информация выводится в удобной для пользователя форме и может быть использована для дальнейшего анализа данных. Пользователь может выбрать наиболее интересующие его задержки и сохранить результаты анализа для дальнейшего использования.
Важно отметить, что расчет задержек является одним из наиболее важных шагов при анализе временных рядов и может оказать значительное влияние на точность
и качество полученных результатов. Поэтому, программа предоставляет пользователю возможность настраивать параметры анализа и уточнять результаты в соответствии с его потребностями и требованиями.
После выполнения анализа сигналов и расчета показателей корреляционных
функций, программа предоставляет пользователю наглядное представление результатов в виде графиков, где каждый график представлен синим цветом на соответствующих осях исходных графиков сигналов. Графики могут быть легко сравнены, чтобы
оценить относительные задержки между ними.
Пользователь может сохранить результаты анализа для дальнейшего использования, а также выполнить любое доступное ранее действие или выйти из программы.
В целом, программа обеспечивает высокую точность и надежность при анализе сигналов и предоставляет удобный и простой интерфейс для пользователя. На вкладке
результатов выводятся начальные параметры:
- исходный график;
- начальная координата;
- конечная координата.
Также в таблицу выводятся задержки для каждого анализируемого графика.
36
Рисунок 4.6 - Корреляционный анализ
4.3 Разработка алгоритмов для отображения графиков
Сигналы принято отображать как во временном представлении, так и в частотном. Каждый из указанных видов представления сигналов помогает пользователю
узнать дополнительные данные о свойствах сигнала.
Поскольку данные с датчиков снимаются во временном представлении и записываются в файл, то при загрузке сигнал отображается во временном представлении.
Для преобразования сигнала из временного представления в частотное используется
преобразование Фурье. Преобразование Фурье позволяет не только преобразовывать
сигнал из временного представления в частотное, но и наоборот. Но. поскольку формула преобразования Фурье представляет собой интеграл и требует значительного
времени для вычисления, то использовать данное преобразование следует только для
прямого преобразования, то есть для преобразования из временного представления в
частотное. При необходимости показать сигнал опять во временном представлении,
37
он будет повторно считан из файла.
Таким образом, будет реализовано 2 алгоритма: один для временного, другой
для частотного представления сигнала.
Рисунок 4.7 - Представление графика во временном представлении
Рисунок 4.8 - Представление графика в частотном представлении
38
4.4 Разработка алгоритма высокочастотной фильтрации
Первый шаг реализации алгоритма высокочастотной фильтрации Баттерворта
состоит в определении параметров фильтра. Это включает выбор частоты среза
(cutoff frequency), порядка фильтра (filter order) и типа фильтра (например,
Butterworth).
Частота среза определяет частоту, ниже которой происходит срезание (подавление) высокочастотных составляющих сигнала. Это означает, что частоты выше частоты среза будут подавлены, а частоты ниже частоты среза будут сохранены.
Порядок фильтра определяет, насколько быстро будет снижаться амплитуда высокочастотных составляющих. Больший порядок фильтра обеспечивает более крутой
спад амплитуды высокочастотных составляющих, что может быть полезно в случае
необходимости сильной фильтрации сигнала. Однако больший порядок фильтра
также может приводить к более заметным искажениям в низкочастотных частях спектра сигнала.
Тип фильтра определяет форму функции передачи фильтра. Например, фильтр
Баттерворта является типом фильтра, который имеет равномерную функцию передачи и плавный переход между проходной полосой и зоной подавления. В зависимости от требований к спектру сигнала, могут быть выбраны различные типы фильтров,
такие как Кайзера, Чебышева и т. д.
В целом, правильный выбор параметров фильтра является важным этапом в реализации алгоритма высокочастотной фильтрации Баттерворта, так как это может существенно влиять на результаты фильтрации.
Второй шаг реализации алгоритма высокочастотной фильтрации Баттерворта состоит в расчете коэффициентов фильтра. Для этого необходимо знать параметры
фильтра - частоту среза и порядок фильтра. Частота среза определяет частоту, ниже
которой происходит срезание (подавление) высокочастотных составляющих сигнала,
а порядок фильтра определяет, насколько быстро будет снижаться амплитуда высокочастотных составляющих.
На основе этих параметров можно рассчитать коэффициенты фильтра. Для фильтра Баттерворта это может быть сделано с использованием математических формул,
зависящих от выбранного типа фильтра и его параметров. Коэффициенты фильтра
являются значениями, используемыми для вычисления выходного сигнала фильтра
на основе входного сигнала.
Расчет коэффициентов фильтра может быть выполнен с использованием различных инструментов и языков программирования, в зависимости от того, как реализован фильтр. В целом, это может быть реализовано с помощью математических функций и операций, таких как расчет коэффициентов полиномов, вычисление корней
уравнения, а также использование различных алгоритмов.
После расчета коэффициентов фильтра они могут быть использованы для фильтрации входного сигнала на следующем этапе реализации алгоритма.
Третий шаг реализации алгоритма высокочастотной фильтрации Баттерворта заключается в применении фильтра к входному сигналу. Для этого необходимо использовать полученные на предыдущем этапе коэффициенты фильтра и исходную формулу фильтра Баттерворта. Скомбинировав их мы можем получить высокочастотный
39
фильтра Баттерворта
Полный алгоритм работы фильтра Баттерворта для высоких частот представлен
ниже.
Рисунок 4.9 - Алгоритм работы высокочастотной фильтрации Баттерворта
4.4 Разработка алгоритма низкочастотной фильтрации
Первый шаг в реализации алгоритма низкочастотной фильтрации Баттерворта
состоит определении трех ключевых параметров фильтра: частоты разделения, порядка фильтра и типа фильтра.
- Частота разделения (separation frequency) - это частота, на которой происходит
разделение частот сигнала на две категории: низкочастотные составляющие, которые
нужно сохранить, и высокочастотные составляющие, которые нужно отфильтровать
40
В отличие от частоты среза, которая определяет граничную частоту, на которой происходит подавление сигнала, частота разделения является точкой, на которой сигнал
разделяется на две категории.
- Порядок фильтра (filter order) определяет насколько быстро будет снижаться
амплитуда низкочастотных составляющих. Порядок фильтра может быть любым положительным целым числом.
- Тип фильтра - это способ, которым фильтр пропускает частоты и подавляет
другие частоты.
После определения параметров фильтра, можно перейти к следующему шагу расчету коэффициентов фильтра, который основан на выбранных параметрах фильтра и использует математические формулы, зависящие от типа фильтра. Коэффициенты фильтра затем используются для фильтрации входного сигнала в шаге 3, после
чего результаты оцениваются в шаге 4. Если результаты не соответствуют требованиям, можно провести настройку параметров фильтра и повторить процесс в шагах
1-4.
Второй шаг реализации алгоритма низкочастотной фильтрации Баттерворта состоит в расчете коэффициентов фильтра на основе параметров, определенных на шаге
1 (частоты разделения, порядка фильтра и типа фильтра).
Для расчета коэффициентов фильтра Баттерворта можно использовать математические формулы, которые зависят от выбранного типа фильтра и его параметров.
Формулы могут быть найдены в специальной литературе или с помощью специализированных программных инструментов.
Рассчитанные коэффициенты фильтра могут быть представлены в виде чисел с
плавающей точкой (float), которые могут быть использованы для создания цифрового
фильтра, который далее будет описан в программном коде, реализующем цифровой
фильтр в соответствии с заданными коэффициентами.
После того, как коэффициенты фильтра были рассчитаны, необходимо проверить их корректность и соответствие заданным параметрам. Это можно сделать путем
анализа частотной характеристики фильтра, которая должна соответствовать заданным параметрам частоты разделения и порядка фильтра.
Если коэффициенты фильтра соответствуют заданным параметрам, то на следующем шаге можно применить фильтр к входному сигналу. Если же коэффициенты
фильтра не соответствуют требованиям, необходимо произвести настройку параметров фильтра и повторить процесс расчета коэффициентов и применения фильтра.
Третий шаг реализации алгоритма низкочастотной фильтрации Баттерворта заключается в применении фильтра к входному сигналу. Для этого необходимо использовать полученные на предыдущем этапе коэффициенты фильтра.
Полный алгоритм работы фильтра Баттерворта для низких частот представлен
ниже.
41
Рисунок 4.9 - Алгоритм работы низкочастотной фильтрации Баттерворта
4.5 Разработка программного кода
Программное средство реализовано на языке программирования Python, так как
для этого языка есть множество бесплатных библиотек для обработки сигналов. Рассмотрим необходимые библиотеки:
- Библиотека matplotlib для работы с графиками. Данная библиотека позволяет
в удобной форме отображать графики сигналов, и масштабировать их, представлять
несколько графиков на одной координатной оси, что помогает сопоставлять исходные сигналы и результаты их обработки[15].
- NumPy - библиотека для работы с многомерными массивами и матрицами.
Она содержит множество функций для выполнения операций над массивами, таких
как вычисление суммы, произведения, скалярного произведения, транспонирования
и других.
- SciPy - библиотека для научных вычислений. Она содержит множество функ42
ций для решения задач, связанных с оптимизацией, интерполяцией, интегрированием, решением дифференциальных уравнений, статистическими вычислениями и
многими другими.
- Sympy - библиотека для символьных вычислений. Она позволяет работать с
математическими выражениями как с объектами, что позволяет решать аналитические задачи.
- TensorFlow - библиотека для работы с искусственными нейронными сетями.
Она позволяет создавать, обучать и использовать нейронные сети для различных задач машинного обучения, таких как классификация, регрессия и другие.
- SymPy Gamma - это интерактивный онлайн-калькулятор, который позволяет
выполнять символьные вычисления с помощью библиотеки SymPy.
Это далеко не полный список библиотек для работы с математическими данными в Python, но они являются одними из наиболее популярных и используемых.
Программное средство многоканальной обработки сигналов состоит из следующего набора классов и функций.
Form1() – инициализация формы.
Form1_Load – загрузка элементов формы.
loadSignalToolStripMenuItem_Click() – функция выпадающего меню, которая
вызывает диалоговое окно открытия сигнала и инициализирует переменные для
загружаемого сигнала.
loadGroupToolStripMenuItem_Click() – функция выпадающего меню, которая
вызывает диалоговое окно открытия группы сигналов и инициализирует пере-менные
для загружаемых сигналов.
LoadSignalToGr() – функция, используемая при загрузке группы сигналов, для
отображения группы сигналов.
AddSignal() – функция, используемая при загрузке одного сигнала, для
отображения этого сигнала.
Dr() – функция для отрисовки одного сигнала и установки параметров
отображения графика.
RedrawSignals() – функция для перерисовки содержимого графиков при отрисовке корреляционных функций.
chooseSignalToolStripMenuItem_Click() – функция выпадающего меню, которая вызывает диалоговое окно установки параметров для корреляционного анализа.
analyseToolStripMenuItem_Click() – функция выпадающего меню, которая
запускает корреляционный анализ.
Max – находит номер максимального элемента массива.
SaveResult_Click() – функция, отвечающая за вызов функции сохранения
результатов из вкладки результатов.
saveResultToolStripMenuItem_Click() – функция выпадающего меню, отвечающая за вызов функции сохранения результатов.
SaveInfo() – функция, сохраняющая результаты анализа в файл.
Класс Signals описывает сигнал.
Класс OpenSignal описывает работу с диалоговым окном для загрузки одного
сигнала.
OpenSignal() – инициализирует диалоговое окно загрузки сигнала
43
5 ТЕСТИРОВАНИЕ ПРОГРАММНОГО СРЕДСТВА
Для проведения тестирования ПС были составлен и выполнен набор тест-кейсов.
Разработанные тест-кейсы приведены в таблице 6.1.
Таблица 6.1 – Описание тест-кейсов
№
Название
Описание
Шаги
1
Запуск
про- Запуск
про1 Запустить Anaграммы
граммы
lyser.exe.
Ожидаемый результат:
Откроется
окно программы с
двумя вкладками.
2
Начальное со- Проверить
1 Запустить Anaстояние глав- начальное состоя- lyser.exe.
ной вкладки
ние вкладки «ИсОжидаемый реходные колеба- зультат:
Откроется
ния»
окно
программы.
Вкладка «Исходные
колебания» активна.
3
Начальное со- Проверить
1 Запустить Anaстояние гра- начальное состоя- lyser.exe.
фиков главной ние
графиков
Ожидаемый ревкладки
вкладки «Исход- зультат:
Откроется
ные колебания»
окно программы. На
вкладке «Исходные колебания» присутствует
четыре пустых графика, имеющих координатную сетку.
4
Начальное со- Активные
эле1 Запустить Anaстояние выпа- менты в меню при lyser.exe;
дающего
запуске
про2 Нажать правой
меню
граммы
кнопкой мыши в окне
программы, но не в области графиков.
Ожидаемый результат: Появится выпадающее меню со
следующими
пунктами: загрузить сигнал, загрузить группу,
выбрать сигнал, запустить анализ, сохранить
Статус
Пройден
Пройден
Пройден
Пройден
44
Продолжение таблицы 6.1
1
2
3
5
Начальное со- Проверить
стояние
начальное состоявкладки
ре- ние вкладки результатов
зультатов
6
Начальное со- Проверить расподержимое
ложение объектов
вкладки
ре- на вкладке «Результатов
зультат» до проведения анализа.
7
Начальное состояние полей
параметров на
вкладке
результатов
Проверить
начальное состояние полей параметров на вкладке
«Результат»
8
Начальное состояние таблицы результатов
на
вкладке ре
Проверить
начальное состояние таблицы результатов
на
вкладке
4
результат.
Только
пункты загрузить сигнал и загрузить группу
должны быть активными.
1 Запустить Analyser.exe.
Ожидаемый результат:
Откроется
окно
программы.
Вкладка «Результат»
не активна.
1 Запустить Analyser.exe;
2 Перейти на
вкладку «Результат».
Ожидаемый результат: Вкладка «Результат» станет активной, данная вкладка
должна
содержать
поля для начальных
параметров анализа,
таблицу для представления результатов и
кнопку для сохранения
результатов.
1 Запустить Analyser.exe
2 Перейти на
вкладку «Результат».
Ожидаемый результат: Поля для
отображения начальных параметров анализа пустые.
1 Запустить Analyser.exe;
2 Перейти на
вкладку «Результат».
Ожидаемый ре -
5
Пройден
Пройден
Пройден
Пройден
45
Продолжение таблицы 6.1
1
2
3
зультатов
«Результат»
9
Начальное состояние
кнопки сохранения результатов
на
вкладке
результатов
Проверить
начальное состояние кнопки сохранения результатов
на вкладке «Результат»
10
Закрытие про- Выход из
граммы
граммы
11
Загрузка корректного
файла с сигналом
про-
Открытие
bin
файла
установленного в спецификации формата
4
зультат: Таблица для
представления результатов не содержит данных.
1 Запустить Analyser.exe;
2 Перейти на
вкладку «Результат».
Ожидаемый результат: Кнопка «Сохранить результат» не
активна.
1 Запустить Analyser.exe;
2
Нажать
на
кнопку закрытия программы в верхнем правом углу.
Ожидаемый результат: программа закроется, нет сообщений об ошибке.
1 Запустить программу;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню «Загрузить сигнал»;
4 В диалоговом
меню выбрать корректный файл *.bin;
5 Указать номер
графика, в который
необходимо загрузить
сигнал;
6
Подтвердить
выбор.
Ожидаемый результат:
5
Пройден
Пройден
Пройден
46
Продолжение таблицы 6.1
1
2
3
12
Загрузка корректного
файла с группой сигналов
Открытие
txt
файла
установленного в спецификации формата
13
Состояние выпадающего
меню
после
загрузки одного сигнала
Активные пункты
выпадающего
меню после загрузки
одного
сигнала
4
5
а) на вкладке с
графиками, в определенном ранее графике,
отобразится выбранный сигнал;
б) если сигнал
очень большой, то появится горизонтальная
полоса прокрутки.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt;
5
Подтвердить
выбор.
Ожидаемый результат:
а) на вкладке с
графиками появятся
сигналы из файлов,
определенных в выбранном файле;
б) если сигналы
очень большой, то появится горизонтальная
полоса прокрутки.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню «Загрузить
47
Продолжение таблицы 6.1
1
2
14
3
4
5
сигнал»;
4 В диалоговом
меню выбрать корректный файл *.bin;
5 Указать номер
графика, в который
необходимо загрузить
сигнал;
6
Подтвердить
выбор;
7 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков.
Ожидаемый результат: Появится выпадающее меню со
следующими
пунктами: загрузить сигнал, загрузить группу,
выбрать сигнал, запустить анализ, сохранить результат. Только
пункты загрузить сигнал, загрузить группу
должны и выбрать сигнал быть активными.
Состояние вы- Активные пункты
1 Запустить про- Пройден
падающего
выпадающего
грамму;
меню
после меню после за2 Нажать правой
загрузки
грузки
группы кнопкой мыши в окне
группы сигна- сигналов
программы, но не в облов
ласти графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt;
5
Подтвердить
выбор;
48
Продолжение таблицы 6.1
1
2
15
Загрузка всех
сигналов с последующей загрузкой
группы сигналов
3
Загрузка всех сигналов по отдельности с последующей
загрузкой
группы сигналов
4
5
6 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков.
Ожидаемый результат: Появится выпадающее меню со
следующими
пунктами: загрузить сигнал, загрузить группу,
выбрать сигнал, запустить анализ, сохранить результат. Только
пункты загрузить сигнал, загрузить группу
должны и выбрать сигнал быть активными.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню «Загрузить сигнал»;
4 В диалоговом
меню выбрать корректный файл *.bin;
5 Указать номер
графика, в который
необходимо загрузить
сигнал;
6
Подтвердить
выбор;
7
Повторить
пункты 2-6 до тех пор,
пока не будут заполнены все имеющиеся
графики;
8 Нажать правой
49
Продолжение таблицы 6.1
1
2
3
16
Загрузка
группы сигналов с последующей загрузкой
одного
сигнала
Загрузка группы
сигналов с последующей загрузкой одного сигнала поверх одного из сигналов
группы
4
5
кнопкой мыши в
окне программы, но не
в области графиков;
9 Выбрать пункт
меню
«Загрузить
группу»;
10 В диалоговом
меню выбрать корректный файл *. txt;
11 Подтвердить
выбор.
Ожидаемый результат:
Графики
должны
содержать
сигналы, заданные в
файле, описывающем
группу сигналов.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt;
5
Подтвердить
выбор;
6 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
7 Выбрать пункт
меню «Загрузить сигнал»;
8 В диалоговом
меню выбрать корректный файл *.bin;
9 Указать номер
50
Продолжение таблицы 6.1
1
2
17
Загрузка сигнала с последующей
загрузкой другого сигнала
на
место
предыдущего
3
4
5
графика, в который
необходимо загрузить
сигнал;
10 Подтвердить
выбор.
Ожидаемый результат: Все графики,
кроме указанного в
пункте 9, должны содержать сигналы, заданные в файле, описывающем группу сигналов. График указанный в пункте 9 должен
содержать сигнал из
файла, выбранного в
пункте 8.
Загрузить два сиг1 Запустить про- Пройден
нала последова- грамму;
тельно в один и
2 Нажать правой
тот же график
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню «Загрузить сигнал»;
4 В диалоговом
меню выбрать корректный файл *.bin;
5 Указать номер
графика, в который
необходимо загрузить
сигнал;
6
Подтвердить
выбор;
7 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
8 Выбрать пункт
меню «Загрузить сигнал»;
51
Продолжение таблицы 6.1
1
2
3
18
Загрузка
Загрузить послегруппы сигна- довательно
две
лов два раза
группы сигналов,
содержащих
в
себе одинаковое
количество сигналов
19
При помощи Найти файл с расфункции «За- ширением отличгрузить
ным от .bin
4
5
9 В диалоговом
меню выбрать другой
корректный
файл
*.bin;
10 Указать тот же
номер графика, что и в
пункте 5;
11 Подтвердить
выбор,
Ожидаемый результат: В выбранном
графике отобразится
последний выбранный
сигнал.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt;
5
Подтвердить
выбор;
6
Повторить
пункты 2-5, выбрав в
четвертом пункте другой корректный файл,
содержащий
группу
сигналов,
Ожидаемый результат: В выбранном
графике отобразится
последняя выбранная
группа сигналов.
1 Запустить про- Пройден
грамму;
2 Нажать правой
52
Продолжение таблицы 6.1
1
2
3
сигнал» загрупри помощи
зить файл с функции «Загрурасширением зить сигнал»
отличным от
.bin
20
При помощи
функции «Загрузить
группу» загрузить файл с
расширением
отличным от
.txt
Найти файл с расширением отличным от .txt при помощи
функции
«Загрузить
группу»
21
Загрузка пу- При
загрузке
стого txt файла группы сигналов,
открыть пустой
файл
4
5
кнопкой мыши в
окне программы, но не
в области графиков;
3 Выбрать пункт
меню «Загрузить сигнал»;
4 В диалоговом
меню выбрать файл с
форматом отличным
от *.bin.
Ожидаемый результат:
Искомый
файл не найден.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать файл с
форматом отличным
от .txt.
Ожидаемый результат:
Искомый
файл не найден.
1 Заранее создать Пройден
пустой
текстовый
файл с корректными и
некорректными
путями;
2 Запустить программу;
3 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
4 Выбрать пункт
меню «Загрузить
53
Продолжение таблицы 6.1
1
2
22
3
Загрузка не- При
загрузке
корректного
группы сигналов,
txt файла
указать файл с
корректными
и
некорректными
путями
4
5
группу»;
5 В диалоговом
меню выбрать созданный файл *. txt;
6
Подтвердить
выбор.
Ожидаемый результат: появится окно
ошибки со следующим
текстом ошибки: «Не
указан путь к файлу
или указан пустой
файл.»
1 Заранее создать Пройден
текстовый файл с корректными и некорректными путями;
2 Запустить программу;
3 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
4 Выбрать пункт
меню
«Загрузить
группу»;
5 В диалоговом
меню выбрать созданный файл *. txt;
6
Подтвердить
выбор.
Ожидаемый результат: появится окно
ошибки со следующим
текстом ошибки: «Не
удалось
загрузить
сигнал i
Неправильное
название файла или
указаный
файл
содержит данные в
другом формате», где
54
Продолжение таблицы 6.1
1
2
23
3
Установка
Проверить состоначальных па- яние
выпадаюраметров
щего меню после
установки начальных параметров
4
5
вместо i будет
указан
номер
грыфика, который не
удалось загрузить.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt;
5
Подтвердить
выбор;
6 Вызвать выпадающее меню;
7 Выбрать пункт
меню «Выбрать сигнал»;
8 В открывшемся
диалоговом окне выбрать сигнал для анализа и установить
начальную и конечные
координаты окна;
9
Подтвердить
выбор;
10 Вызвать выпадающее меню и проверить активные пункты
меню.
Ожидаемый результат: Появится выпадающее меню со
следующими
пунктами: загрузить сигнал, загрузить группу,
выбрать сигнал,
55
Продолжение таблицы 6.1
1
2
24
Запуск
лиза
3
4
5
запустить анализ, сохранить
результат.
Пункты загрузить сигнал, загрузить группу,
выбрать сигнал и запустить анализ должны
быть активными.
ана- Запуск анализа с
1 Запустить про- Пройден
установленными грамму;
параметрами. Ре2 Нажать правой
зультаты на глав- кнопкой мыши в окне
ной вкладке
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt;
5
Подтвердить
выбор;
6 Вызвать выпадающее меню;
7 Выбрать пункт
меню «Выбрать сигнал»;
8 В открывшемся
диалоговом окне выбрать сигнал для анализа и установить
начальную и конечные
координаты окна;
9
Подтвердить
выбор;
10 Вызвать выпадающее меню;
11 Выбрать пункт
меню «Запустить анализ».
Ожидаемый результат: Через некоторое время на осях с
56
Продолжение таблицы 6.1
1
2
25
Запуск
лиза
3
4
5
графиками функций
сигналов появятся графики функций корреляции соответствующих сигналов, которые
будут отображены синим цветом.
ана- Запуск анализа с
1 Запустить про- Пройден
установленными грамму;
параметрами.
2 Нажать правой
Вкладка «Резуль- кнопкой мыши в окне
таты»
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt;
5
Подтвердить
выбор;
6 Вызвать выпадающее меню;
7 Выбрать пункт
меню «Выбрать сигнал»;
8 В открывшемся
диалоговом окне выбрать сигнал для анализа и установить
начальную и конечные
координаты окна;
9
Подтвердить
выбор;
10 Вызвать выпадающее меню;
11 Выбрать пункт
меню «Запустить анализ»;
12 Перейти на
вкладку результатов.
Ожидаемый
57
Продолжение таблицы 6.1
1
2
26
Состояние выпадающего
меню
после
запуска анализа
3
Проверить активные пункты выпадающего
меню
после проведения
анализа
4
5
результат: Появится
номер выбранного графика, начальная и конечная
координаты,
которые были заданы
ранее в пункте «Выбор
сигнала», в таблице
появятся номера графиков с соответствующими задержками, а
кнопка «Сохранить результат» станет активной.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt;
5
Подтвердить
выбор;
6 Вызвать выпадающее меню;
7 Выбрать пункт
меню «Выбрать сигнал»;
8 В открывшемся
диалоговом окне выбрать сигнал для анализа и установить
начальную и конечные
координаты окна;
9
Подтвердить
выбор;
10 Вызвать выпадающее меню;
58
Продолжение таблицы 6.1
1
2
27
Сохранение
результатов из
вкладки «Исходные колебания».
3
Сохранение результатов анализа
в файл при помощи выпадающего меню.
4
5
11 Выбрать пункт
меню «Запустить анализ»;
12 После появления графиков функций
корреляции
вызвать
выпадающее меню и
проверить активные
пункты меню.
Ожидаемый результат: Появится выпадающее меню со
следующими
пунктами: загрузить сигнал, загрузить группу,
выбрать сигнал, запустить анализ, сохранить результат. Все
пункты меню должны
быть активными.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt;
5
Подтвердить
выбор;
6 Вызвать выпадающее меню;
7 Выбрать пункт
меню «Выбрать сигнал»;
8 В открывшемся
диалоговом окне выбрать сигнал для
59
Продолжение таблицы 6.1
1
2
3
4
анализа и установить начальную и конечные
координаты
окна;
9
Подтвердить
выбор;
10 Вызвать выпадающее меню;
11 Выбрать пункт
меню «Запустить анализ»;
12 После появления графиков функций
корреляции
вызвать
выпадающее меню и
выбрать пункт меню
«Сохранить
результат»;
13 Выбрать текстовый файл, в который необходимо сохранить результат и
подтвердить сохранение;
14 Открыть текстовый файл с сохраненными
результатами.
Ожидаемый результат:
Текстовый
файл должен содержать данные согласно
следующей структуре:
Анализируемый
график i
Начальная координата x1
Конечная координата x2
Сигнал n запаздывает на dx
….
5
60
Продолжение таблицы 6.1
1
2
3
28
Сохранение
результатов из
вкладки «Результат».
Сохранение результатов анализа
в файл при помощи
кнопки
«Сохранить результат»
на
вкладке «Результат».
4
5
Где i – выбранный график; x1 - начальная координата, установленная пользователем; x2
- конечная координата,
установленная пользователем; n – порядковый номер графика; dx
- соответствующая задержка.
1 Запустить про- Пройден
грамму;
2 Нажать правой
кнопкой мыши в окне
программы, но не в области графиков;
3 Выбрать пункт
меню
«Загрузить
группу»;
4 В диалоговом
меню выбрать корректный файл *. txt ;
5
Подтвердить
выбор;
6 Вызвать выпадающее меню;
7 Выбрать пункт
меню «Выбрать сигнал»;
8 В открывшемся
диалоговом окне выбрать сигнал для анализа и установить
начальную и конечные
координаты окна;
9
Подтвердить
выбор;
10 Вызвать выпадающее меню;
11 Выбрать пункт
меню «Запустить анализ»;
61
Продолжение таблицы 6.1
1
2
3
4
12 Перейти на
вкладку результатов;
13 Нажать на
кнопку «Сохранить результат»;
14 Выбрать текстовый файл, в который необходимо сохранить результат и
подтвердить сохранение;
15 Открыть текстовый файл с сохраненными
результатами.
Ожидаемый результат:
Текстовый
файл должен содержать данные согласно
следующей структуре:
Анализируемый
график i
Начальная координата x1
Конечная координата x2
Сигнал n запаздывает на dx
….
Где i – выбранный
график; x1 - начальная
координата, установленная пользователем;
x2 - конечная координата, установленная
пользователем; n – порядковый номер графика; dx - соответствующая задержка.
5
Программное средство успешно прошло тестирование на описанном наборе
тест-кейсов.
62
6 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
В данной главе будет описана последовательность действий для работы с программным средством многоканальной обработки сигналов.
Рисунок 6.1 - Начало работы с программой
Для начала работы с программой пользователю необходимо загрузить необходимые сигналы. Для этого следует выполнить ряд простых действий. Во-первых,
необходимо нажать на соответствующую кнопку, расположенную в интерфейсе программы. Обычно кнопка загрузки сигналов обозначена значком, который четко идентифицирует ее функциональное назначение. В данном случае кнопка называется
«Load Signal». После нажатия на эту кнопку перед пользователем открывается выпадающее меню, в котором будут доступны две функции - «Open» и «Cancel». При
нажатии на функцию «Open» пользователь сможет загрузить необходимый сигнал
для дальнейшей обработки в программе. Если же пользователь не желает загружать
сигнал, то он может нажать на функцию «Cancel» и вернуться к предыдущему интерфейсу программы.
63
Рисунок 6.2 - Загрузка сигнала
Для загрузки одного сигнала в открывшемся диалоговом окне необходимо выбрать файл, который надо будет загрузить и нажать кнопку «Open», как показано на
рисунке 6.2.
Рисунок 6.3 - Ошибка 1 при загрузке группы сигналов
Если выбранный файл содержит данные в неправильном формате или в выбранном файле указан неверный путь, то появится ошибка, как показано на рисунке 6.4.
Рисунок 6.4 - Ошибка 2 при загрузке сигнала
64
Если не был выбран файл или был выбран пустой файл, то появится ошибка,
как показано на рисунке 6.4.
После выбора конкретного сигнала пользователь может приступить к работе с
сигналом. На данном моменте сигнал загружен в память компьютера и пользователь
может применить к нему любую функцию обработки сигнала.
После загрузки сигнала пользователь может визуально просмотреть график сигнала нажатием кнопки «Show plots». По нажатию на данную кнопку пользователю
предоставляется возможность ввести канал энцефалограммы и обрабатываемую
букву или буквы, если пользователь желает конкатинировать несколько сигналов.
Рисунок 6.5 - Ввод номера канала и букв
По нажатию кнопки «Submit» перед пользователем открывается окно, где он может просматривать сигнал во временном представлении.
Рисунок 6.6 - Отображение загруженных сигналов
65
Для проведения корреляционного анализа пользователь должен запустить программу и нажать кнопку «Find Correlation» в главном меню, после чего перед ним
откроется диалоговое окно для выбора файла. Пользователь может выбрать файлы
сигналов, которые он хочет проанализировать. После выбора файлов программа
начнет проводить анализ и вычислять корреляцию между сигналами. Результаты вычислений записываются в таблицу, которая затем используется для построения графиков корреляционных функций.
После завершения анализа программа автоматически выводит таблицы корреляционных функций. Пользователь может проанализировать эти таблицы и определить относительные задержки между сигналами.
Рисунок 6.7 - Окно выбора файла для проведения корреляции
После выбора первого сигнала пользователю будет предложено выбрать второй
сигнал. По нажатию кнопки «Open» происходит загрузка сигналов в программу. После загрузки обоих сигналов перед пользователем появится окно в котором ему предстоит ввести номер канала первого сигнала, номер канала второго сигнала, исходные
буквы первого сигнала, исходные буквы второго сигнала, количество подсигналов на
которые будет разбит исходный сигнал и файл вывода информации.
66
Рисунок 6.8 - Окно ввода параметров для корреляции
По нажатию кнопки «Submit» начинается проведение корреляционного анализа,
результаты проведения анализа оказываются в файле, путь к которому указан пользователем. Файл должен представлять собою csv файл. Результаты вывода представлены на рисунке 6.10.
Рисунок 6.9 - Результаты вывода корреляционного анализа
Здесь первая колонка представляет собой индекс i-го куска сигнала, а вторая
колонка содержит оценку корреляции.
Для выполнения высокочастотной фильтрации пользователь необходимо будет
нажать кнопку «Apply high-pass Butterworth filtering». После нажатия кнопки пользователю будет предложено ввести частоту среза сигнала, порядок фильтра, номер канала и номера букв. Для считывания этих параметров пользователю необходимо
нажать кнопку «Submit»
67
Рисунок 6.10 - Окно ввода параметров для проведения фильтрации
После нажатия кнопки «Submit» Пользователю будет показан исходный график
сигнала, где пользователь может просмотреть интересующие его участки сигнала
Рисунок 6.11 - Отображение исходного сигнала
По закрытию первого графика пользователю будет показан следующий график,
отображающий отфильтрованный сигнал.
68
Рисунок 6.12 - Отображение отфильтрованного сигнала
Для выполнения низкочастотной фильтрации пользователь необходимо будет
нажать кнопку «Apply low-pass Butterworth filtering». После нажатия кнопки пользователю будет предложено ввести частоту среза сигнала, порядок фильтра, номер канала и номера букв. Для считывания этих параметров пользователю необходимо
нажать кнопку «Submit».
Рисунок 6.13 - Окно ввода параметров для проведения фильтрации
После нажатия кнопки «Submit» Пользователю будет показан исходный график
сигнала, где пользователь может просмотреть интересующие его участки сигнала
69
Рисунок 6.14 - Отображение исходного сигнала
По закрытию первого графика пользователю будет показан следующий график,
отображающий отфильтрованный сигнал.
Рисунок 6.15 - Отображение отфильтрованного сигнала
70
Преобразование Фурье осуществляется по нажатию кнопки «Apply Fourier
Transform». По нажатию на данную кнопку перед пользователем появляется окно
ввода гиперпараметров номера канала для обработки и номера букв, которые будут
анализироваться.
Рисунок 6.16 - Окно ввода номера канала и номеров букв
По нажатию кнопки «Submit» будет осуществлено преобразование Фурье, которое будет представлено двумя графиками. Первый график будет показывать частотное представление сигнала с возможностью просмотра графика по частотным окнам.
График показан на рисунке 6.18
Рисунок 6.17 - График отображения сигнала в частотном представлении и частотным окном
71
После закрытия первого графика пользователю будет автоматически показан
второй график, который отображает полный сигнал во временной области, а не
только его частотное представление. Второй график также позволяет пользователю
производить различные операции с сигналом, например, изменять масштаб, перемещать график влево или вправо, выбирать различные фильтры и применять их к сигналу. Пользователь может выбирать, какой из графиков ему удобнее использовать в
каждый момент времени в зависимости от его задач и потребностей.
Рисунок 6.18 - График отображения сигнала в частотном представлении
Пользователь программного обеспечения может выбрать из двух графиков тот,
который удобнее для анализа сигнала. В зависимости от потребностей и предпочтений пользователей, каждое представление может иметь свои преимущества. Например, в графике временной диаграммы пользователь может увидеть подробную информацию о временных параметрах сигнала, а в графике спектральной диаграммы - частотные характеристики сигнала.
Чтобы начать поиск сигналов Р300, пользователь должен нажать кнопку «Find
P300». После нажатия данной кнопки система начинает анализировать сигналы и
отображать результаты в режиме реального времени. В процессе поиска кнопка «Find
P300» меняет свой цвет и глубину, отображая прогресс анализа, как показано на рисунке 6.20. Как только система обнаружит сигналы Р300, результаты будут автоматически записаны в файл, который можно просмотреть позже.
72
Рисунок 6.19 - Изменение глубины кнопки «Find P300»
После того, как пользователь произвел поиск сигналов, программа сохраняет полученные результаты. Кнопка «Find Signal» снова принимает свой прежний вид, указывая на то, что поиск завершен. Все результаты поиска записываются в файл, где
для каждого временного окна i ставится в соответствие присутствие или отсутствие
сигнала Р300, обозначаемые соответственно как 1 и 0. Эти данные могут использоваться для дальнейшего анализа и исследования. Важно отметить, что эта функция
является очень полезной для исследования электроэнцефалограмм и может быть использована в различных научных областях, таких как нейробиология и психофизиология.
Рисунок 6.20 - Вывод результатов поиска Р300 в файл
73
7 ТЕХНИКО-ЭКОНОМИЧЕСКОЕ ОБОСНОВАНИЕ
ЭФФЕКТИВНОСТИ РАЗРАБОТКИ ПРОГРАММНОГО СРЕДСТВА
ОБРАБОТКИ ЭНЦЕФАЛОГРАММ
7.1 Характеристика программного средства, разрабатываемого для
собственных нужд
Разрабатываемое программное средство представляет собой десктоп приложение, которое будет использоваться для поиска артефактов Р300 на энцефалограммах.
Приложение будет реализовано на языке программирования python с использованием библиотек tensorflow, numpy, matplotlib.
Программное средство, в процессе своей работы, позволит решить следующие
задачи:
- детектирование сигналов Р300 на временной ленте;
- предварительная обработка сигналов, снятых с головного мозга;
- визуализация полученных результатов используя модель человеческого головного мозга;
- интерпретация полученных результатов в форме, понятной человеку;
- облегчение рутинной работы докторов по работе с энцефалограммами;
Программное средство будет разработано сотрудниками медицинского учреждения, являющимися программистами, предоставляющим услуги в сфере здравоохранения на территории Республики Беларусь. Организация может воспользоваться
данным программным средством для облегчения рутинной работы своих сотрудников, для замены аналогов программного средства, применяемых в данный момент в
организации, на новые, с более высокой точностью и дополненным функционалом.
Данное программное средство является актуальным для компании, нуждающейся в нем, так как с ростом увеличения мощностей современной техники, увеличивается и количество получаемых с ее помощью данных, которые человек, без использования специального программного обеспечения, не всегда способен интерпретировать и анализировать с приемлемой скоростью.
Таким образом, разрабатываемое программное обеспечение будет создаваться
по заказу компании для собственных нужд. Прибыль будет формироваться за счет
экономии на выплаты заработных плат сотрудникам.
7.2 Расчет инвестиций в разработку программного средства для
собственных нужд
7.2.1 Затраты на основную заработную плату разработчиков
Первоначально производится расчет затрат на основную заработную плату команды разработчиков
Данный расчёт осуществляется исходя из состава и численности команды, размера месячной заработной платы каждого участника команды, а также трудоемкости
работ, выполняемых при разработке программного средства отдельными исполнителями по формуле:
74
n
Зо = Кпр ∑ Зчi ⋅ ti,
(7.1)
i=1
где Кпр – коэффициент премий;
n – категории исполнителей, занятых разработкой программного
средства;
Зчi – часовая заработная плата исполнителя i-й категории, руб.;
ti – трудоёмкость работ, выполняемых исполнителем i-й категории, ч.
Данные по заработной плате команды разработчиков предоставлены
организацией на 28.03.2023.
Результаты расчетов приведены в таблице 7.1.
Таблица 7.1 – Расчет основной заработной платы команды разработчиков
Участник
команды
Проектныйменеджер
Cпециалистнейрофизиолог
Разработчик основной логики
Тестировщик
Месячная
заработная
плата, руб.
Часовая
заработная
плата, руб.
Трудоемкость
работ, ч.
Итого,
руб.
2100
12,50
80
1000
1713,6
10,20
144
1468,8
1932
11,50
160
1840
1495,2
8,90
96
854,4
Итого
5163,2
Премия и иные стимулирующие выплаты (20%)
1032,64
Всего затрат на основную заработную плату разработчиков
6195,84
7.2.2 Расчет общей суммы затрат на разработку
Общая сумма затрат на разработку программного средства Зр находитсяпо
формуле:
Зр = Зо + Зд + Рсоц + Рпр,
(7.2)
где
Зо – основная заработная плата специалистов, руб.;
Зд – дополнительная заработная плата специалистов, руб.;
Рсоц – отчисления на социальные нужды, руб.;
Рпр – прочие затраты, руб.
Дополнительная заработная плата разработчиков рассчитывается по следующей
75
формуле:
Зд =
где
Зо ∙ Нд
100
,
(7.3)
Зо — затраты на основную заработную плату, (руб.);
По формуле (7.3) вычислим:
Зд =
6195,84 ∙ 20
= 1239,16 руб.
100
Нд — норматив дополнительной заработной платы (принимается равным 20%).
Отчисления на социальные нужды Рсоц рассчитываются в соответствии с действующими законодательными актами по формуле:
Рсоц =
(Зо + Зд ) ∙ Нсоц
100
,
(7.4)
где Нсоц — норматив отчислений в ФСЗН и Белгосстрах (принимается равным 35%).
По формуле (7.4) вычислим:
Рсоц =
(6195,84 + 1239,16) ∙ 35
= 2572,51 руб.
100
Прочие затраты включаются в себестоимость разработки программного средства
в процентах от затрат на основную заработную плату разработчикам по формуле:
Рпр =
Зо ∙ Нпз
100
,
(7.5)
где Нпз — норматив прочих затрат (35%).
По формуле (7.5) вычислим:
Рпр =
6195,84 ∙ 35
= 2168,54 руб.
100
Используя формулу (7.2), вычислим общую сумму затрат на разработку:
Зр = 6195,84 + 1239,16 + 2572,51 + 2168,54 = 12176 руб.
Результаты, полученные с помощью формул 7.2-7.6 представлены в таблице 7.2.
76
Таблица 7.2 — Расчет общей суммы затрат на разработку программного
средства для собственных нужд
Наименование статьи
затрат
1. Основная заработная
плата специалистов
2. Дополнительная
заработная плата
специалистов
3. Отчисления на
социальные нужды
Формула для
расчета
Сумма, руб.
См. табл. 7.1
6195,84
Формула (7.3)
1239,16
Формула (7.4)
2572,51
4. Прочие расходы
Формула (7.5)
2168,54
5. Общая сумма инвестиций (затрат) на
разработку
Формула (7.2)
12176,06
По результатам расчетов в таблицах 7.1 и 7.2 можно сделать вывод, что общая
сумма инвестиций на разработку программного средства поиска сигналов Р300 при
привлечении четырех специалистов составит 12176,06 руб.
7.3Расчет показателей экономической эффективности разработки и
использования программного средства
Основной целью разработки системы является облегчение труда работников предприятия при анализе сигналов Р300 на энцефалограммах. Экономическим эффектом при применении разработанного программного средства в данном
случае является прирост чистой прибыли засчёт экономии затрат на заработную
плату служащих в связи с сокращением их численности.
Экономия на заработной плате и начислениях на заработную плату сотрудников за счет снижения трудоемкости работ рассчитывается по формуле:
Эпз.п = ∑𝑛𝑖=1 ∆Ч𝑖 ∙ З𝑖 ∙ (1 +
Нд
100
) ∙ (1 +
Нсоц
100
),
(7.6)
где ∆Ч𝑖 – численность работников i-й категории, высвобожденных после
внедрения программного средства, чел.;
З𝑖 – годовая заработная плата высвобожденных работников i-й категории после внедрения программного средства;
Нд – норматив дополнительной заработной платы (Нд = 20%);
77
Нсоц – ставка отчислений от заработной платы, включаемых в себестоимость (Нсоц = 34,6%).
Согласно данным по заработной плате администратора медицинского учереждения, предоставленным организацией на 28.03.2023, месячная заработная плата
сотрудника составляет 1200 руб.
По формуле (7.6) вычислим:
Эпз.п = 1200 ∙ 12 ∙ (1 +
20
34.6
) ∙ (1 +
) = 23258,88 руб.
100
100
Прирост чистой прибыли ∆Пч , полученной организацией за счет экономии
на текущих затратах предприятия, рассчитывается по формуле:
∆Пч = (Этеч − ∆Зп.с
тек ) ∙ (1 −
Нп
100
),
(7.7)
где Этек – экономия на текущих затратах при использовании программного
средства, руб.;
∆Зтек п.с – прирост текущих затрат, связанных с использованием программного средства, руб.;
Нп – ставка налога на прибыль, % (Нп = 20%).
Прирост текущих затрат ∆Зтек п.с , связанных с использованием программного средства, за год составит 4000 руб., которые будут использованы для его доработки.
По формуле (7.7) вычислим:
∆Пч = (23258,88 − 4000) ∙ (1 −
20
100
) = 15407,1 руб.
Применение программного средства для поиска сигналов Р300 на энцефалограммах имеет не только экономическое значение, но и практическую значимость.
Согласно результатам исследования, использование данного ПО позволит организации увеличить чистую прибыль на 15407,1 рублей. Это достигается за счет сокращения затрат на персонал и снижения количества ошибок, связанных с ручным управлением системой.
Однако, преимущества программного средства не ограничиваются только экономическими показателями. Использование данного ПО улучшает качество работы и
повышает эффективность, что в свою очередь увеличивает удобство использования
для пользователей. Удобство использования может стать причиной привлечения новых клиентов и повышения доходов организации.
Следовательно, разработка и использование программного средства для поиска
сигналов Р300 на энцефалограммах является важным шагом в развитии и улучшении
работы организации. Это позволяет сократить затраты, повысить эффективность,
улучшить удобство использования и увеличить прибыль.
78
7.4Расчет показателей экономической эффективности разработки и
использования программного средства в организации
Оценить экономическую эффективность разработки и реализации программного средства можно с помощью понятия рентабельности инвестиций, так как
сумма инвестиций (затрат) на разработку меньше суммы экономического эффекта
за первый год. Она рассчитывается по следующей формуле:
𝑅𝑂𝐼 =
∆Пч −Зр
Зр
∙ 100% ,
(7.8)
где ∆Пч ‒ прирост чистой прибыли, полученной от разработанного программного средства, руб.;
Зр ‒ затраты на разработку программного средства, руб.
По формуле (7.8) вычислим:
𝑅𝑂𝐼 =
15407,1 − 12176,06
∙ 100% = 26,5%
12176,06
Из представленных данных видно, что разработка программного средства поиска сигналов Р300 на энцефалограммах является инвестицией, которая может привести к значительному приросту чистой прибыли и экономии на текущих затратах.
Показатель рентабельности инвестиций составляет 26,5%, что говорит о том, что затраты на разработку в размере 12176,06 рублей будут окупаться в первый год производства.
При этом прирост чистой прибыли составит 15407,1 рублей, а экономия на текущих затратах - 23258,88 рублей. Полученные значения показателей экономической
эффективности подтверждают экономическую целесообразность данной инвестиции.
Кроме того, использование программного средства может улучшить удобство
его использования для пользователей, что может привести к увеличению клиентской
базы и повышению доходов в долгосрочной перспективе. В целом, разработка программного средства поиска сигналов Р300 на энцефалограммах может привести к значительному увеличению эффективности работы организации и экономии времени,
что может быть выгодно как для компании, так и для ее клиентов.
79
ЗАКЛЮЧЕНИЕ
В дипломном проекте были указаны сферы, в которых применяется цифровая
обработка сигналов, и описаны примеры использования анализа сигналов для некоторых из указанных областей.
Были рассмотрены наиболее часто используемые методы для анализа характеристик сигналов. Проанализированы существующие программные средства для обработки сигналов. Были рассмотрены достоинства и недостатки существующих программных аналогов, а также предоставляемые ими возможности для анализа сигналов.
Были проанализированы проблемы, с которыми сталкиваются пользователи в
процессе проведения цифрового анализа.
На основе рассмотренных современных методов анализа цифровых сигналов,
существующих программных средств для обработки сигналов и проблем, с которыми
сталкиваются пользователи при анализе сигналов, была разработана спецификация
требований к разрабатываемому программному средству.
Для проектирования программного средства были выбраны следующие методы
анализа сигналов: многоканальный корреляционный анализ и преобразование Фурье.
В качестве формата входных параметров используется формат данных соответствующий формату файлов, формируемых ИВК «Тембр».
В качестве выходного формата используется формат, разработанный в процессе
проектирования программного средства многоканальной обработки сигналов.
На основе спецификации требований, установленного входного формата данных и разработанного выходного формата данных было спроектировано программное средство многоканальной обработки сигналов.
Разработанная программа многоканальной обработки сигналов предоставляет
следующие функции:
- загрузка одного сигнала;
- загрузка группы сигналов;
- просмотр сигналов;
- многоканальный корреляционный анализ;
- просмотр построенных функций корреляции;
- просмотр задержек между сигналами;
- сохранение результатов обработки.
Разработанное программное средство обладает простым и понятным интерфейсом, что позволяет быстро освоить методику работы с ним.
Программное средство многоканальной обработки сигналов успешно прошло
тестирование на различных наборах входных сигналов.
80
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
[1] Introduction to Digital Filters: Lowpass Filters [Электронный ресурс]. – Электронные данные. – Режим доступа: https://www.allaboutcircuits.com/technicalarticles/introduction-to-digital-filters-lowpass-filters
[2] High-pass filtering of EEG signals using IIR filters [Электронный ресурс]. –
Электронные данные. – Режим доступа: https://www.researchgate.net/publication/331872076_High-pass_filtering_of_EEG_signals_using_IIR_filters. – Дата доступа:
25.03.2023
[3] Independent component analysis: algorithms and applications. Neural networks.
/ Hyvärinen, A., & Oja, E,2000 – 411с.
[4] Neural Networks and Learning Machines. Prentice Hall, 3rd edition /S. Haykin,
2009 – 22c
[5] Introduction to Digital Signal Processing and Filter Design [Электронный ресурс]. – Электронные данные. – Режим доступа: https://www.mathworks.com/content/dam/mathworks/mathworks-dot-com/moler/dsp/Barani-IntroDSPandFilterDesign.pdf.
– Дата доступа: 29.03.2023
[6] A beginner's guide to Fourier transform [Электронный ресурс]. – Электронные данные. – Режим доступа: https://towardsdatascience.com/a-beginners-guide-to-fourier-transform-19f617686c2. – Дата доступа: 25.03.2023
[7] Поликар, Р. Введение в вейвлет-преобразование / Р. Поликар. Пер. с англ.
В.Г., Грибунин. – Санкт-Питербург: АВТЭКС, 2006. – 320с.
[8] Introduction to EEG Analysis using EEGLAB and ERPLAB. Учебное пособие./ U.C. Alifornia. – Спб. : Изд-во ООО "МОДУС+" – 1999г.
[8] Основы анализа спектра. Что такое спектр? Для чего измерять спектр?
[Электронный ресурс]. – Электронные данные. – Режим доступа:
http://www.astena.ru/st_ag_5.html. – Дата доступа: 29.04.2023
[8] Signal Processing Toolbox – Обработка сигналов и изображений –
Matlab.Exponenta.Ru [Электронный ресурс]. – Электронные данные. – Режим доступа: http://matlab.exponenta.ru/signalprocess/index.php. – Дата доступа: 19.04.2023
[9] Sutton, S., Braren, M., Zubin, J., & John, E. R. Evoked-potential correlates of
stimulus uncertainty. – М.: DMK Press, 1965. – 1187c
[10] Signal Processing Extension Pack [Электронный ресурс]. – Электронные
данные. – Режим доступа: http://www.pro-technologies.ru/product/MSPE
[11]Andrew ng, Deep Learning Specialization. [Электронный ресурс]. – Электронные данные. – Режим доступа: http://coursera.org. – Дата доступа: 15.04.2023
[12] Recent advantages in EGG sensors. [Электронный ресурс]. – Электронные
данные. – Режим доступа: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7225959/
– Дата доступа: 21.04.2023
[13] Козлов, П.В. Вейвлет-преобразование и анализ временных рядов. [Электронный
ресурс].
–
Электронные
данные.
–
Режим
доступа:
http://www.krsu.edu.kg/vestnik/2002/v2/a15.html . – Дата доступа: 29.03.2023
[14] Айфичер, Э.С. Цифровая обработка сигналов: практический подход, 2-е издание./ Э. С. Айфичер. Пер. с англ. – М.: Издательский дом «Вильямс», 2008. – 992 с.
[15] ZedGraph Class Library Documentation 5.0.9.
81
[16] Михнюк, Т.Ф. Охрана труда и основы экологии: учеб. Пособие / Т.Ф. Михнюк – Минск: Выш. шк., 2007.
[17] Кремер, К. Человеческий фактор. В 6 т. Т. 5. Эргономические основы проектирования рабочих мест: Пер. с англ. / К. Кремер, Д. Чэффин, М. Айюб и др. – М.:
Мир, 1992. – 390с.
[18] СанПиН 9-131 РБ 2000. Гигиенические требования к видеодисплейным
терминалам, электронно – вычислительным машинам и организации работы. Санитарные правила и нормы.
82
ПРИЛОЖЕНИЕ А
(Обязательное)
Листинг программы
import numpy as np
import string
import csv
from playsound import playsound
import customtkinter
import tkinter.font as font
import matplotlib
import seaborn as sns
import pygame
sns.set()
matplotlib.use("TkAgg")
from scipy import signal
from tkinter import *
from itertools import chain
from tkinter import filedialog
from matplotlib import pyplot as plt
from PIL import ImageTk,Image
from matplotlib.widgets import Slider
from scipy.io import loadmat
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
def fft(input_data):
def DFT_Single(input_vector):
input_vector = np.asarray(input_data, dtype = 'float')
N
= input_data.shape[0]
n
= np.arange(N)
k
= n.reshape((N, 1))
Ω
= np.exp(-2j * np.pi * k * n / N)
return np.dot(Ω, input_vector)
input_data = np.asarray(input_data, dtype = 'float')
N
= input_data.shape[0]
if N <= 32:
return DFT_Single(input_data)
else:
f_even = fft(input_data[::2])
f_odd = fft(input_data[1::2])
factor = np.exp(-2j * np.pi * np.arange(N) / N)
83
combined = np.concatenate([f_even + factor[:N//2] * f_odd,
f_even + factor[N//2:] * f_odd])
return combined
from keras.layers import *
from keras.models import Model
from keras import backend as K
from keras import Sequential
from keras.callbacks import ModelCheckpoint
from sklearn.preprocessing import scale
from sklearn.preprocessing import MinMaxScaler
from keras.callbacks import EarlyStopping
def cecotti_normal(shape, dtype = None, partition_info = None):
if len(shape) == 1:
fan_in = shape[0]
elif len(shape) == 2:
fan_in = shape[0]
else:
receptive_field_size = 1
for dim in shape[:-2]:
receptive_field_size *= dim
fan_in = shape[-2] * receptive_field_size
return K.random_normal(shape, mean = 0.0, stddev = (1.0 / fan_in))
# Custom tanh activation function
def scaled_tanh(z):
return 1.7159 * K.tanh((2.0 / 3.0) * z)
def CNN1_model(channels=64, filters=10):
model = Sequential([
Conv1D(
filters = filters,
kernel_size = 1,
padding = "same",
bias_initializer = cecotti_normal,
kernel_initializer = cecotti_normal,
use_bias = True,
activation = scaled_tanh,
input_shape = (78, channels)
),
Conv1D(
filters = 50,
kernel_size = 13,
padding = "valid",
84
strides = 11,
bias_initializer = cecotti_normal,
kernel_initializer = cecotti_normal,
use_bias = True,
activation = scaled_tanh,
),
Flatten(),
Dense(100, activation="sigmoid"),
Dense(1, activation="sigmoid")
])
model.compile(optimizer = 'adam', loss = 'mean_squared_error', metrics = ['accuracy'])
return model
data=0
num_of_channels = 0
init_dir = 'D:\\p300-speller-master\\dataset'
def on_click_load_signal():
print('load')
print()
global data
global init_dir
global num_of_channels
path = filedialog.askopenfilename(
initialdir=init_dir,title='Select a file',filetypes=[("mat file","*.mat")])
data = loadmat(path)
num_of_channels = data['Signal'][0][0]
def plot_data(x,y):
fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)
l, = plt.plot(x,y)
pos_window = max(x) if max(x) < 100 else 100
plt.xlim(0, pos_window)
axcolor = 'lightgoldenrodyellow'
axpos = plt.axes([0.2, 0.1, 0.65, 0.03], facecolor=axcolor)
spos = Slider(axpos, 'Pos', 0, max(x))
def update(val):
pos = spos.val
ax.set(xlim=[pos,pos+pos_window])
fig.canvas.draw_idle()
85
spos.on_changed(update)
plt.show()
def on_click_plot():
print('plot')
print()
top = Toplevel()
def on_click_channel():
signals = data['Signal']
channel = int(channels_e.get())
letters = letters_e.get()
letters = [int(s) for s in letters.split(',')]
cutted_signals = []
for letter in letters:
cutted_signals.append(signals[letter,:,channel])
top.destroy()
top.update()
y = list(chain.from_iterable(cutted_signals))
x = np.arange(0.0, len(y), 1)
plot_data(x,y)
label = Label(top,text='Enter number of channel|quantity of letters')
submit_b = Button(top,text='Submit',padx=5,pady=2,width =
=on_click_channel)
channels_e = Entry(top,width=20,borderwidth=5)
letters_e = Entry(top,width=20,borderwidth=5)
20,command
label.pack()
channels_e.pack()
letters_e.pack()
submit_b.pack()
def on_click_fourier():
print('fourier')
print()
ass = False
def on_click_submit():
sampling_freq=240
signals = data['Signal']
channel = int(channels_e.get())
letter = int(letters_e.get())
cutted_signal = signals[letter,:,channel]
86
power = 0
while(len(cutted_signal)>=np.power(2,power)):
power+=1
power -=1
x = np.arange(0, np.power(2,power), 1)
y = cutted_signal[0:np.power(2,power)]
z=fft(y)
sp = np.fft.fft(y)
freq = np.arange(len(z))/(len(z)/sampling_freq)
print('x: ',len(freq))
print('y: ',len(abs(z)))
print(freq)
print(y)
plot_data(freq,abs(z))
plt.plot(freq, abs(z), '-r', label='lol')
plt.xlabel('#Frequency, Hz')
plt.ylabel('Magnitude')
plt.legend(loc='upper right')
plt.title('FFT')
plt.show()
top = Toplevel()
label = Label(top,text='Enter channel|letter')
submit_b = Button(top,text='Submit',padx=5,pady=2,width
=on_click_submit)
channels_e = Entry(top,width=20,borderwidth=5)
letters_e = Entry(top,width=20,borderwidth=5)
=
20,command
label.pack()
channels_e.pack()
letters_e.pack()
submit_b.pack()
def cor(y1,y2):
y1 = np.array(y1)
y2 = np.array(y2)
num = np.sum(y2*y1)/len(y1)
denum = np.sqrt(np.sum(y1*y1)*np.sum(y2*y2))/len(y1)
corr = num/denum
return corr
def on_click_p300():
print('p300')
87
print()
if False:
global data
signals_test = data['Signal']
flashing_test = data['Flashing']
word_test = data['TargetChar']
stimulus_code_test = data['StimulusCode']
CHANNELS = [i for i in range(64)]
SAMPLING_FREQUENCY = 240
# From the dataset description we know that there are 15 repetitions
REPETITIONS = 15
# Compute the duration of the recording in minutes
RECORDING_DURATION_TEST
=
(len(signals_test))*(len(signals_test[0]))/(SAMPLING_FREQUENCY*60)
# Compute number of trials
TRIALS_TEST = len(word_test[0])
# Number of samples for each character in trials
SAMPLES_PER_TRIAL_TEST = len(signals_test[0])
print("**********************************")
print("
TEST SET INFORMATION ")
print("**********************************")
print("Sampling Frequency: %d Hz [%.2f ms]" % (SAMPLING_FREQUENCY,
(1000/SAMPLING_FREQUENCY)))
print("Session duration: %.2f min" % RECORDING_DURATION_TEST)
print("Number of letters: %d" % TRIALS_TEST)
print("Spelled word:
%s" % ''.join(word_test))
# Create characters matrix
char_matrix = [[0 for j in range(6)] for i in range(6)]
s = string.ascii_uppercase + '1' + '2' + '3' + '4' + '5' + '6' + '7' + '8' + '9' + '_'
# Append cols and rows in a list
list_matrix = []
for i in range(6):
col = [s[j] for j in range(i, 36, 6)]
list_matrix.append(col)
for i in range(6):
row = [s[j] for j in range(i * 6, i * 6 + 6)]
list_matrix.append(row)
# Create StimulusType array for the test set (missing from the given database)
stimulus_test = [[0 for j in range(SAMPLES_PER_TRIAL_TEST)] for i in
88
range(TRIALS_TEST)]
stimulus_test = np.array(stimulus_test)
for trial in range(TRIALS_TEST):
counter=0
for sample in range(SAMPLES_PER_TRIAL_TEST):
index = int(stimulus_code_test[trial, sample]) - 1
if not index == -1:
if word_test[0][trial] in list_matrix[index]:
stimulus_test[trial, sample] = 1
else:
stimulus_test[trial, sample] = 0
# Application of butterworth filter
b, a = signal.butter(4, [0.1/SAMPLING_FREQUENCY, 20/SAMPLING_FREQUENCY], 'bandpass')
for trial in range(TRIALS_TEST):
signals_test[trial, :, :] = signal.filtfilt(b, a, signals_test[trial, :, :], axis=0)
# Down-sampling of the signals from 240Hz to 120Hz
DOWNSAMPLING_FREQUENCY = 120
SCALE_FACTOR = round(SAMPLING_FREQUENCY / DOWNSAMPLING_FREQUENCY)
SAMPLING_FREQUENCY = DOWNSAMPLING_FREQUENCY
print("# Samples of EEG signals before downsampling: {}".format(len(signals_test[0])))
signals_test = signals_test[:, 0:-1:SCALE_FACTOR, :]
flashing_test = flashing_test[:, 0:-1:SCALE_FACTOR]
stimulus_test = stimulus_test[:, 0:-1:SCALE_FACTOR]
print("# Samples of EEG signals after downsampling: {}".format(len(signals_test[0])))
N_CHANNELS = len(CHANNELS)
# Window duration after each flashing [ms]
WINDOW_DURATION = 650
# Number of samples of each window
WINDOW_SAMPLES = round(SAMPLING_FREQUENCY
DOW_DURATION / 1000))
# Number of samples for each character in trials
SAMPLES_PER_TRIAL_TEST = len(signals_test[0])
*
(WIN-
89
test_features = []
test_labels = []
windowed_stimulus = []
count_positive = 0
count_negative = 0
for trial in range(TRIALS_TEST):
for sample in (range(SAMPLES_PER_TRIAL_TEST)):
if (sample == 0) or (flashing_test[trial, sample-1] == 0 and flashing_test[trial, sample] == 1):
lower_sample = sample
upper_sample = sample + WINDOW_SAMPLES
window = signals_test[trial, lower_sample:upper_sample, :]
# Extracting number of row/col in a window
number_stimulus = int(stimulus_code_test[trial, sample])
windowed_stimulus.append(number_stimulus)
# Features extraction
test_features.append(window)
# Labels extraction
if stimulus_test[trial, sample] == 1:
count_positive += 1
test_labels.append(1) # Class P300
else:
count_negative += 1
test_labels.append(0) # Class no-P300
#@@@
# Get test weights to take into account the number of classes
test_weights = []
for i in range(len(test_labels)):
if test_labels[i] == 1:
test_weights.append(len(test_labels)/count_positive)
else:
test_weights.append(len(test_labels)/count_negative)
test_weights = np.array(test_weights)
# Convert lists to numpy arrays
test_features = np.array(test_features)
test_labels = np.array(test_labels)
#@@@
# 3D tensor (SAMPLES, 64, 78)
dim_test = test_features.shape
print("Features tensor shape: {}".format(dim_test))
90
# Data normalization Zi = (Xi - mu) / sigma
for pattern in range(len(test_features)):
test_features[pattern] = scale(test_features[pattern], axis=0)
best_model = CNN1_model(channels=64, filters=10)
best_model.load_weights('D:\\p300-speller-master\\model_saves\\B\\model.h5')
best_model.compile(optimizer = 'adam', loss = 'mean_squared_error', metrics =
['accuracy'])
predictions = best_model.predict(test_features)
predictions = np.round(predictions)
score = np.array(best_model.evaluate(test_features, test_labels, verbose=0, sample_weight=test_weights))
print("Model performance on test set:\t[ Loss: {}\tAccuracy: {} ]".format(*score.round(4)))
print("\nPredictions: {}\nSolutions: {}".format(list(map(int, predictions))[:50],
list(map(int, test_labels))[:50]))
def on_click_filtering_high():
print('filtering high')
print()
def high_filt():
signals = data['Signal']
channel = int(channel_e.get())
letters = letter_e.get()
letters = [int(s) for s in letters.split(',')]
cutted_signals = []
for letter in letters:
cutted_signals.append(signals[letter,:,channel])
y = list(chain.from_iterable(cutted_signals))
x = np.arange(0.0, len(y), 1)
wc = int(wc_e.get())
n = int(n_e.get())
top.destroy()
top.update()
samplingFreq = 1000; # sampled at 1 kHz = 1000 samples / second
tlims = [0,1]
# in seconds
signalFreq = [2,50]; # Cycles / second
signalMag = [1,0.5]; # magnitude of each sine
t = x#np.linspace(tlims[0],tlims[1],(tlims[1]-tlims[0])*samplingFreq)
91
y
=
y#signalMag[0]*np.sin(2*np.pi*signalFreq[0]*t)
Mag[1]*np.sin(2*np.pi*signalFreq[1]*t)
plot_data(t,y)
+
signal-
wc=wc*2*np.pi
a = np.zeros(n+1)
gamma = np.pi/(2.0*n)
a[0] = 1 # first coef is always 1
for k in range(0,n):
rfac = np.cos(k*gamma)/np.sin((k+1)*gamma)
a[k+1] = rfac*a[k]
c = np.zeros(n+1)
for j in range(0,n+1):
c[j] = a[n-j]*pow(wc,n-j)
c_flip = np.flip(c)
num = np.zeros(n+1)
num[0] = 1
den = c_flip
highPass = signal.TransferFunction(num,den)
dt = 1.0/samplingFreq;
discreteHighPass = highPass.to_discrete(dt,method='tustin',alpha=0.5)
b = discreteHighPass.num;
a = -discreteHighPass.den;
Nb = len(b)
yfilt = np.zeros(len(y))
for m in range(3,len(y)):
yfilt[m] = b[0]*y[m]
for i in range(1,Nb):
yfilt[m] += a[i]*yfilt[m-i] + b[i]*y[m-i]
plot_data(t,yfilt)
top = Toplevel()
label = Label(top,text='Enter cutoff frequency|filter order \n # of channel|# of letter')
submit_b
=
Button(top,text='Submit',padx=5,pady=2,width
=
20,command=high_filt)
wc_e = Entry(top,width=20,borderwidth=5)
wc_e.insert(0, '20')
n_e = Entry(top,width=20,borderwidth=5)
n_e.insert(0, '3')
channel_e = Entry(top,width=20,borderwidth=5)
92
channel_e.insert(0, '1')
letter_e = Entry(top,width=20,borderwidth=5)
letter_e.insert(0, '1')
label.pack()
wc_e.pack()
n_e.pack()
channel_e.pack()
letter_e.pack()
submit_b.pack()
def on_click_filtering_low():
print('filtering low')
print()
def low_filt():
signals = data['Signal']
channel = int(channel_e.get())
letters = letter_e.get()
letters = [int(s) for s in letters.split(',')]
cutted_signals = []
for letter in letters:
cutted_signals.append(signals[letter,:,channel])
y = list(chain.from_iterable(cutted_signals))
x = np.arange(0.0, len(y), 1)
wc = int(wc_e.get())*2*np.pi
n = int(n_e.get())
top.destroy()
top.update()
samplingFreq = 1000; # sampled at 1 kHz = 1000 samples / second
tlims = [0,1]
# in seconds
signalFreq = [2,50]; # Cycles / second
signalMag = [1,0.2]; # magnitude of each sine
t = x#np.linspace(tlims[0],tlims[1],(tlims[1]-tlims[0])*samplingFreq)
y
=
y#signalMag[0]*np.sin(2*np.pi*signalFreq[0]*t)
+
Mag[1]*np.sin(2*np.pi*signalFreq[1]*t)
plot_data(t,y)
signal-
a = np.zeros(n+1)
gamma = np.pi/(2.0*n)
a[0] = 1; # first coef is always 1
for k in range(0,n):
rfac = np.cos(k*gamma)/np.sin((k+1)*gamma)
93
a[k+1] = rfac*a[k] # Other coefficients by recursion
c = np.zeros(n+1)
for k in range(0,n+1):
c[n-k] = a[k]/pow(wc,k)
w0 = 2*np.pi*5; # pole frequency (rad/s)
num = [1]; # transfer function numerator coefficients
den = c;
# transfer function denominator coefficients
lowPass = signal.TransferFunction(num,den) # Transfer function
dt = 1.0/samplingFreq;
discreteLowPass = lowPass.to_discrete(dt,method='gbt',alpha=0.5)
b = discreteLowPass.num;
a = -discreteLowPass.den;
Nb = len(b)
yfilt = np.zeros(len(y));
for m in range(3,len(y)):
yfilt[m] = b[0]*y[m];
for i in range(1,Nb):
yfilt[m] += a[i]*yfilt[m-i] + b[i]*y[m-i]
plot_data(t,yfilt)
return
top = Toplevel()
label = Label(top,text='Enter cutoff frequency|filter order \n # of channel|# of letter')
submit_b
=
Button(top,text='Submit',padx=5,pady=2,width
=
20,command=low_filt)
wc_e = Entry(top,width=20,borderwidth=5)
wc_e.insert(0, '5')
n_e = Entry(top,width=20,borderwidth=5)
n_e.insert(0, '3')
channel_e = Entry(top,width=20,borderwidth=5)
channel_e.insert(0, '1')
letter_e = Entry(top,width=20,borderwidth=5)
letter_e.insert(0, '1')
label.pack()
wc_e.pack()
n_e.pack()
channel_e.pack()
letter_e.pack()
submit_b.pack()
94
def split(a, n):
k, m = divmod(len(a), n)
return list((a[i*k+min(i, m):(i+1)*k+min(i+1, m)] for i in range(n)))
def on_click_correlations():
print('correlations')
global data
on_click_load_signal()
data_1 = data
on_click_load_signal()
data_2 = data
data = 0
def correlations():
signals = data_1['Signal']
channel = int(channel1_e.get())
letters = letter1_e.get()
letters = [int(s) for s in letters.split(',')]
cutted_signals = []
for letter in letters:
cutted_signals.append(signals[letter,:,channel])
y1 = list(chain.from_iterable(cutted_signals))
x1 = np.arange(0.0, len(y1), 1)
signals = data_2['Signal']
channel = int(channel2_e.get())
letters = letter2_e.get()
letters = [int(s) for s in letters.split(',')]
cutted_signals = []
for letter in letters:
cutted_signals.append(signals[letter,:,channel])
num_of_pieces = int(pieces_e.get())
path = path_e.get()
top.destroy()
top.update()
y2 = list(chain.from_iterable(cutted_signals))
x2 = np.arange(0.0, len(y2), 1)
y1 = split(y1,num_of_pieces)
95
y2 = split(y2,num_of_pieces)
correlations=[]
for piece in range(num_of_pieces):
corr = cor(y1[piece],y2[piece])
correlations.append(corr)
with open(path, 'a', newline='') as file:
writer = csv.writer(file)
for piece in range(num_of_pieces):
writer.writerow([piece,correlations[piece]])
print(correlations)
return
top = Toplevel()
label = Label(top,text=' # of channel|# of letter\n # of pieces\n file path')
submit_b = Button(top,text='Submit',padx=5,pady=2,width = 20,command=correlations)
channel1_e = Entry(top,width=20,borderwidth=5)
channel1_e.insert(0, '1')
letter1_e = Entry(top,width=20,borderwidth=5)
letter1_e.insert(0, '1')
channel2_e = Entry(top,width=20,borderwidth=5)
channel2_e.insert(0, '1')
letter2_e = Entry(top,width=20,borderwidth=5)
letter2_e.insert(0, '1')
pieces_e = Entry(top,width=20,borderwidth=5)
pieces_e.insert(0, '10')
path_e = Entry(top,width=20,borderwidth=5)
path_e.insert(0, 'D:\\file_corr.csv')
label.pack()
channel1_e.pack()
letter1_e.pack()
channel2_e.pack()
letter2_e.pack()
pieces_e.pack()
path_e.pack()
submit_b.pack()
96
ПРИЛОЖЕНИЕ Б
(Обязательное)
Скриншот результатов проверки системы «Антиплагиат»
97
Download
Study collections