Laboratorium EEG/Konwerter plików Svarog–Matlab: Różnice pomiędzy wersjami
(Nie pokazano 8 wersji utworzonych przez 2 użytkowników) | |||
Linia 2: | Linia 2: | ||
=Konwerter plików Svarog-Matlab= | =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 | + | 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. | + | 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; | * nazwa pliku z danymi; | ||
* liczba zapisanych kanałów; | * liczba zapisanych kanałów; | ||
* częstość próbkowania danych; | * częstość próbkowania danych; | ||
+ | * format użyty do zapisu liczb; | ||
* liczba zapisanych próbek; | * liczba zapisanych próbek; | ||
* nazwy kanałów; | * nazwy kanałów; | ||
Linia 17: | Linia 18: | ||
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 <tt><rs:exportFileName></tt> a znacznikiem <tt></rs:exportFileName></tt>. Wystarczy więc znaleźć początek i koniec każdego znacznika, a następnie „pobrać” informację spomiędzy tych pozycji. | 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 <tt><rs:exportFileName></tt> a znacznikiem <tt></rs:exportFileName></tt>. 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 <tt>findstr</tt> i <tt>strfind</tt> mają w naszym przypadku mniejsze zastosowanie, gdyż operują na tekstach jednowierszowych (bez znaków nowego wiersza), a nasz tekst jest | + | Do przeszukiwania tekstów mamy dostępnych kilka różnych funkcji. Funkcje <tt>findstr</tt> i <tt>strfind</tt> 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 <tt>regexp</tt>, 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: | Wskazówki: | ||
Linia 23: | Linia 24: | ||
* Aby z tekstu (zawierającego cyfry) zrobić liczbę stosujemy funkcję <tt>str2double</tt>. | * Aby z tekstu (zawierającego cyfry) zrobić liczbę stosujemy funkcję <tt>str2double</tt>. | ||
− | 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 | + | 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): |
+ | {| border="1" | ||
+ | | style="width:35px; text-align:center;" | ''x''<sub>1</sub>(''t''<sub>1</sub>) | ||
+ | | style="width:35px; text-align:center;" | ''x''<sub>2</sub>(''t''<sub>1</sub>) | ||
+ | | style="width:35px; text-align:center;" | ... | ||
+ | | style="width:35px; text-align:center;" | ''x''<sub>''k''</sub>(''t''<sub>1</sub>) | ||
+ | | style="width:35px; text-align:center;" | ''x''<sub>1</sub>(''t''<sub>2</sub>) | ||
+ | | style="width:35px; text-align:center;" | ''x''<sub>2</sub>(''t''<sub>2</sub>) | ||
+ | | style="width:35px; text-align:center;" | ... | ||
+ | | style="width:35px; text-align:center;" | ''x''<sub>''k''</sub>(''t''<sub>2</sub>) | ||
+ | | style="width:35px; text-align:center;" | ... | ||
+ | | style="width:35px; text-align:center;" | ... | ||
+ | | style="width:35px; text-align:center;" | ''x''<sub>''k''</sub>(''t''<sub>''N''</sub>) | ||
+ | |} | ||
+ | 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 <tt>double</tt> (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ą <tt>reshape(dane,(liczba_kanalow, liczba_probek))</tt> albo <tt>dane.reshape((liczba_kanalow, liczba_probek))</tt>. | ||
− | |||
− | |||
− | |||
Ostatnim etapem przygotowywania danych będzie zastosowanie odpowiedniego montażu — oczywiście jako procedury w Matlabie. | Ostatnim etapem przygotowywania danych będzie zastosowanie odpowiedniego montażu — oczywiście jako procedury w Matlabie. | ||
+ | |||
+ | Plik zawierający przykładowe dane do wczytania: [[Plik:Sygnal_p300_kalib.tar.gz]]. proszę go pobrać i wypakować do osobnego katalogu. Po wypakowaniu powinny się tam pojawić 3 pliki: | ||
+ | * sygnał binarny: p_6301423_calibration_p300.obci.raw | ||
+ | * opis xml: p_6301423_calibration_p300.obci.xml | ||
+ | * plik ze znacznikami: p_6301423_calibration_p300.obci.tag - tym plikiem na dzisiejszych zajęciach nie będziemy się zajmować | ||
+ | |||
+ | Proszę wczytać ten sygnał do SVAROGA żeby przekonać się jak te dane wyglądają, a następnie napisać funkcję wczytującą te dane do Matlaba. | ||
+ | |||
[[Laboratorium_EEG]]/Konwerter | [[Laboratorium_EEG]]/Konwerter |
Aktualna wersja na dzień 07:51, 13 mar 2018
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.
Plik zawierający przykładowe dane do wczytania: Plik:Sygnal p300 kalib.tar.gz. proszę go pobrać i wypakować do osobnego katalogu. Po wypakowaniu powinny się tam pojawić 3 pliki:
- sygnał binarny: p_6301423_calibration_p300.obci.raw
- opis xml: p_6301423_calibration_p300.obci.xml
- plik ze znacznikami: p_6301423_calibration_p300.obci.tag - tym plikiem na dzisiejszych zajęciach nie będziemy się zajmować
Proszę wczytać ten sygnał do SVAROGA żeby przekonać się jak te dane wyglądają, a następnie napisać funkcję wczytującą te dane do Matlaba.
Laboratorium_EEG/Konwerter