Otagowany sygnał można pociąć wzdłuż znaczników. Służy do tego klasa SmartTag.
from obci_readmanager.signal_processing.smart_tags_manager import SmartTagsManager
from obci_readmanager.signal_processing.tags.smart_tag_definition import (
SmartTagDurationDefinition,
SmartTagEndTagDefinition)
from obci_readmanager.signal_processing.read_manager import ReadManager
import numpy
# Utwórz definicję cięcia - fragmenty od 100 ms przed znacznikiem
#typu "target" do 600 ms po tym znaczniku
tag_def = SmartTagDurationDefinition(start_tag_name="target",
start_offset=-0.1,
end_offset=0.0,
duration=0.7)
# Utwórz obiekt zarządzający
smgr = SmartTagsManager(tag_def,
"data.xml",
"data.raw",
"data.tag")
# Alternatywnie:
mgr = ReadManager('data.xml', 'data.raw', 'data.tag')
smgr = SmartTagsManager(tag_def, '', '', '', mgr)
# Uśrednij wszystkie znalezione fragmenty sygnału
avg = numpy.mean([i.get_samples() for i in smgr], axis=0)
# Zsumuj wszystkie fragmenty, których startowy znacznik spełnia zadane
# kryteria:
# * znacznik o długości dwudziestu sekund zaczynający się od piątej sekundy
# * spełniający dodatkowe kryterium func
func = lambda s_tag: int(s_tag["desc"]["value"]) == 0
tags = smgr.get_smart_tags(p_from=5.0, p_len=20.0, p_func=func)
avg = numpy.mean([i.get_samples() for i in tags], axis=1)
# Wypisz wszystkie fragmenty zaczynające się znacznikiem typu "target",
# a kończące się pół sekundy przed kolejnym znacznikiem
# typu "target" lub "non-target"
tag_def = SmartTagEndTagDefinition(start_tag_name="target",
start_offset=-0.1,
end_offset=-0.5,
end_tags_names=["target", "non-target"]
)
mgr = SmartTagsManager(tag_def,
"data.xml",
"data.raw",
"data.tag"
)
for i_smart_tag in mgr.iter_smart_tags():
print(i_smart_tag.get_samples())
Obiekty klasy SmartTag reprezentują wycięty fragment sygnału. Klasa dziedziczy z klasy ReadManager tak więc dostęp do wyciętego fragmentu jest identyczny, jak w przypadku całego sygnału. Pozwala to tworzyć moduły transformacji sygnału działające zarówno dla całego sygnału reprezentowanego przez obiekt ReadManager, jak i dla fragmentów sygnału reprezentowanych przez obiekt SmartTag.
W zależności od typu cięcia użyj jednej z dwóch podklas klasy SmartTag:
SmartTagDuration — reprezentuje fragment sygnału o zadanej długości, rozpoczynający się od zadanego startowego znacznika, np: fragment długości jednej sekundy zaczynający się od znacznika typu 'target'.
SmartTagEndTag — reprezentuje fragment sygnału zaczynający się od zadanego początkowego znacznika i kończący się na zadanym końcowym znaczniku, np: fragment zaczynający się od znacznika typu 'target' i kończący się na najbliższym kolejnym znaczniku również typu 'target'.
UWAGA!
Nie twórz obiektów klasy SmartTag bezpośrednio!
Odpowiada za to klasa SmartTagsManager. Obiekty klasy SmartTagsManager tworzą, agregują i udostępniają obiekty klasy SmartTag. Klasa SmartTagsManager wymaga na wejściu obiektu klasy SmartTagDefinition. Obiekty klasy SmartTagDefinition określają dokładną definicję cięcia sygnału na fragmenty.