Laboratorium EEG/Konwerter plików Svarog–Matlab

Z Brain-wiki

Laboratorium_EEG/Konwerter

Konwerter plików Svarog-Matlab

Do zbierania danych podczas eksperymentów używamy na pracowniach programu Svarog. Zapisuje on pliki z danymi w postaci binarnej, natomiast cała informacja o strukturze takiego pliku danych (tzw. metadane) przechowywana jest w osobnym pliku typu XML. Aby móc analizować nasze pliki danych w Matlabie musimy umieć wczytać i odpowiednio interpretować informacje w nich zawarte. Niestety nie mamy gotowej funkcji dla wczytywania plików zapisywanych przez Svaroga, a także dostępne domyślnie funkcje do obróbki zbiorów typu XML nie nadają się do tego celu.

Jak łatwo się domyśleć, pierwszym krokiem musi być „wyciągnięcie” z pliku XML podstawowych informacji o zapisanych danych. Plik XML ma format tekstowy, możemy więc go otworzyć w edytorze tekstu (na przykład matlabowym), ale ta metoda nie jest szczególnie użyteczna, jako bardzo pracochłonna. Wczytajmy więc ten plik do Matlaba i postarajmy się automatycznie znaleźć wszystkie potrzebne informacje. Będą to:

  • nazwa pliku z danymi;
  • liczba zapisanych kanałów;
  • częstość próbkowania danych;
  • format użyty do zapisu liczb;
  • liczba zapisanych próbek;
  • nazwy kanałów;
  • wzmocnienie (gain) i poziom (offset) w każdym kanale;
  • czas rozpoczęcia rejestracji.

Jak wczytać plik tekstowy do Maltaba? Wskazówką niech będzie przykład ze zliczaniem liter w poprzednim rozdziale. Różnica jest tylko taka, że tam traktowaliśmy litery tekstu jako liczby, a teraz potrzebujemy znaków tekstowych. Musimy zastosować inny typ wczytywanych danych: *char.

Jeśli udało nam się wczytać plik XML i mamy go w postaci wektora znaków w Matlabie, następnym krokiem będzie wyszukanie w tym tekście potrzebnych nam informacji. Czego będziemy szukać w naszym pliku XML? Jak łatwo zauważyć potrzebne nam informacje „opakowane” są specjalnymi znacznikami. Na przykład nazwa „właściwego” pliku danych zawarta jest pomiędzy znacznikiem <rs:exportFileName> a znacznikiem </rs:exportFileName>. Wystarczy więc znaleźć początek i koniec każdego znacznika, a następnie „pobrać” informację spomiędzy tych pozycji.

Do przeszukiwania tekstów mamy dostępnych kilka różnych funkcji. Funkcje findstr i strfind mają w naszym przypadku mniejsze zastosowanie, gdyż operują na tekstach jednowierszowych (bez znaków nowego wiersza), a nasz tekst jest wielowierszowy. Na szczęście jest do dyspozycji funkcja regexp, która poszukuje wyrażeń znakowych w wektorach znaków. Na dodatek zwraca indeksy początków i końców każdego znalezionego fragmentu!

Wskazówki:

  • Transpozycję macierzy uzyskujemy dopisując apostrof ' na końcu transponowanego wyrażenia.
  • Aby z tekstu (zawierającego cyfry) zrobić liczbę stosujemy funkcję str2double.

Jeśli już wszystko wiemy na temat naszych danych, możemy je odczytać. Dane są zapisane w formacie binarnym, a jego struktura jest następująca (przy założeniu k kanałów i długości danych N próbek):

x1(t1) x2(t1) ... xk(t1) x1(t2) x2(t2) ... xk(t2) ... ... xk(tN)

Kolejne kratki oznaczają tu kolejne liczby w pliku. Format taki nazywamy przeplatanym lub multipleksowanym.

Jeśli plik nie jest bardzo duży możemy go w całości wczytać do Matlaba. Operacja jest w zasadzie analogiczna do wczytania pliku XML, z taką różnicą, że teraz format wczytywanych danych jest double (lub inny, w zależności od informacji z pliku XML), czyli dane są binarne (nie da się ich przeczytać w edytorze tekstu). Po udanym wczytaniu danych, w pamięci mamy zmienną zawierającą dane z pliku o postaci jednowymiarowego wektora jak na przedstawionym powyżej rysunku. Należy go przekształcić do postaci macierzy o właściwych rozmiarach komendą reshape(dane,(liczba_kanalow, liczba_probek)) albo dane.reshape((liczba_kanalow, liczba_probek)).

Ostatnim etapem przygotowywania danych będzie zastosowanie odpowiedniego montażu — oczywiście jako procedury w Matlabie.

Laboratorium_EEG/Konwerter