среда, 2 ноября 2011 г.

Подключаем OpenVibe к MATLAB

Изучая список улучшений в последней крайней версии OpenVibe 0.12.0 вычитал там наличие поддержки MATLAB Filter. Правда есть и предупреждение о том, что он еще нестабилен.
Последней каплей воды было прочтение материала по "реальному" применению вейвлетов для очистки ЭЭГ от шумов и выделении P300.
К моему большому удивлению этот материал был - не наукообразной статьей с кучей формул и умных слов, напечатанной в каком-то ну очень крутом научном журнале. Это было очень простое руководство и демонстрационный модуль для запуска в MATLAB. Найти и скачать его можно тут. Рекомендую Всем для изучения механизмов фильтрации сигнала от шума с помощью дискретного многоуровневого вейвлет-преобразования. Конечно после изучения вопроса сразу зачесались руки написать для OpenVibe крутой адаптивный фильтр на базе вейвлет-преобразаваний, но для начала конечно отшлифовать алгоритм в MATLAB.


Но как говорится человек предполагает , а жизнь вносит свои коррективы.
Не смотря на то, что компонент "MATLAB filter" входит сейчас в дистрибутив OpenVibe - 0.12.0 чтобы его запустить надо немного попариться (у меня ушло около дня).
В принципе данные в интернете все есть, но разбросаны по разным источникам. Это и было основной проблемой. Плюс есть ряд нюансов, которые видимо всплыли из-за работы под Windows (ребята в INRIA как Я понял в основном сидят на Linux, наверно им поэтому и хватает денег).

Для тех кто не понял зачем это ВСЁ вообще нужно, отвечаю по порядку:
- Быстрая разработка приложения. (Время - деньги - цена проекта)
- Возможность опробовать широкий спектр алгоритмов без их реализации на C++ или другом языке программирования.
- Анализ данных offline.
- Обкатка математических концепций на реальном объекте.

Конечно недостатки тоже есть:
- Медленнее чем код на С++ (Хотя сейчас народ на чем только не пишет, умудряются и на JAVA обработку писать)
- Избыточное потребление памяти (Под все переменные выделяется ячейки по 8 байт - Double)
- Закрытый код (В какой-то степени да, но зато его очень много)
- Дорого (Пока жив РуТрекер и ПиратБэй, а в России не навели окончательный порядок с легальным софтом - проблема не грозит.Тем более еще вопрос. Что дешевле 2-3 месяца программиста с з/п 2-3 тыс. баксов или купить на эти деньги софт который послужит гораздо дольше.
- Язык удобный для быстрой разработки, но неудобный для больших проектов (Я понимаю подразумевается отсутствие в MATLAB ООП)

Итак собственно приступаем (на компьютере естественно должны быть установлены и OpenVibe и MATLAB, OpenVibe - НЕ ЗАПУЩЕН)

1) Правим файл /share/openvibe.conf
Находим и меняем строчку Designer_ShowUnstable = false на
инконгруэнтную
(да я знаю что значит это слово ;)

2) Правим файл /dependencies/set-env.cmd
Добавляем такую строчку SET OV_DEP_MATLAB=C:\Program Files\matlab\r2011a

3) Запускаем OpenVibe
На панельке Boxes(это та что справа) находим раздел Tools > в ней чудесным образом появится компонент "Matlab Filter"

4) Перетаскиваем компонент на форму и вызываем его свойства.
Нам требуется задать параметр "Matlab Working Directory" это та директория которая будет содержать M-файлы наших скриптов для MATLAB-а.

Задавая имя нужно следовать трем правилам:

- Не поддаться соблазну просто вставить туда путь к директории из Проводника (он дает другие '\' вместо '/' ) , либо вставить но потом поменять их на инконгруэнтные.

- Путь не должен содержать пробела например директории "Program Files" - ну вот так вот. (Ребята немного не учли суровой реальности)

- В этой директории должны будут располагаться два файла один должен называться bci_Initialize.m, другой bci_Process.m
В принципе они могут называться как угодно (имена этих файлов задаются в свойствах компонента Matlab Filter) - но зачем нам лишние телодвижения?

5) По указанному выше пути создаем файл bci_Initialize.m следующего содержания.
% bci_Initialize.m
% -------------------------------
% This file contains the function called once by the matlab box on its initialization (when playing the scenario).
% - bci_context     : Time range covered (start time / end time)
% - matrix          : the streamed matrix received on the box input.

% Example: display a message and initialize the matrix with zeros.
% Please note the semicolon at the end of the instructions. 
% Doing so prevent matlab from printing the result of the instruction in the console.
function [matrix_out] = bci_Initialize(bci_context, matrix_in)
        msg = 'User-defined function bci_Initialize has been called.'
 
        disp(msg)
        
        [sample_count,channel_count] = size(matrix_in)

        matrix_out = zeros(sample_count, channel_count)

и файл bci_Process.m
% bci_Process.m
% -------------------------------
% This file contains the function called at each process() in the matlab box.
% - bci_context     : Time range covered (start time / end time)
% - stimulation_set : stims received on the box input, this set is empty most of the time
% - matrix          : the streamed matrix received on the box input.

% Example: plot the matrix, and print the stimulation set content if it is not empty
% Please note the semicolon at the end of the instructions. 
% Doing so prevent matlab from printing the result of the instruction in the console.
function [matrix_out,stim_out]=bci_Process(bci_context,matrix_in,stim_in)
        plot(matrix_in)
        if numel(stim_in) ~= 0
                stim_in
                disp('Start and end time are:')
                bci_context
        end
        [sample_count,channel_count] = size(matrix_in)
 
        matrix_out = matrix_in
 
        stim_out = stim_in

Собственно на этом наверно все. Даже не понимаю на что ушло все время, но к концу силы иссякли, пыл слегка угас :) Так что разборка с применением вейвлетов будет в следующей серии фильма - конечно если Вы меня не опередите ;)

На сладкое история про то почему меня так замкнуло на слово "инконгруэнтно".
Листаю вчера книги по Neuroscience вдруг попадается такое чудо "Self-Control in Societi, Mind and Brain" стр. 15-16 Oxford 2010 год. В описании эксперимента по созданию конфликта различения цветов попадается такое описание:
"However, if an iI trial was incongruent in the Simon dimension and the preceding incongruent trial was incongruent in the Stroop dimension (or vice versa), conlict adaptation did not occur. "
Итого для описания одной понятной ситуации, что мозгу труднее адаптироваться к противоречивым данным при изменении условий задачи, слова инконгруэнтно было использовано 3 раза , а слова пространство- 2.
Да кому интересно что это был за эксперимент могут почитать его описание тут.

Комментариев нет:

Отправить комментарий