Laboratorium EEG/Wprowadzenie do syg online: Różnice pomiędzy wersjami
(Utworzono nową stronę "=== Sygnał testowy === Do zabawy w dalszych częściach zajęć przyda nam się jakiś sygnał testowy. Dla ustalenia uwagi niech będzie to suma trzech sinusoid, niec...") |
m (→GRA) |
||
(Nie pokazano 8 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 24: | Linia 24: | ||
W niektórych analizach wygodnie mieć fragment sygnału, który zawiera aktualnie otrzymane ze sterownika próbki sygnału wraz z pewnąliczbą poprzednich próbek. Do tego celu przydatna jest kolejka typu first-in-first-out (FIFO). | W niektórych analizach wygodnie mieć fragment sygnału, który zawiera aktualnie otrzymane ze sterownika próbki sygnału wraz z pewnąliczbą poprzednich próbek. Do tego celu przydatna jest kolejka typu first-in-first-out (FIFO). | ||
− | Poroszę zaimplementować i zilustrować działanie kolejki FIFO, o długości | + | * Poroszę zaimplementować i zilustrować działanie kolejki FIFO, o długości <code>N_probek</code>. |
+ | Program powinien pokazywać cały sygnał testowy, a poniżej jego dotychczas otrzymany fragment i zaznaczony fragment znajdujący się w buforze kolejki. | ||
+ | * Proszę dopisać obliczanie i wykreślanie periodogramu dla aktualnego stanu kolejki. | ||
+ | |||
+ | |||
+ | === Prosty detektor przekroczenia progu === | ||
+ | * Z naszego sygnału testowego zróbmy sygnał o zmiennej mocy. Np. tak: | ||
+ | <source lang =py> | ||
+ | s = xn*(1-0.5*np.sin(2*np.pi*1*t)) | ||
+ | plt.plot(s**2) | ||
+ | </source> | ||
+ | |||
+ | * Zaimplementuj przepuszczanie tego sygnału przez bufor FIFO. Dla każdego stanu bufora wylicz średnią kwadratową (ang. RMS root mean square): | ||
+ | czyli pierwiastek ze średniej arytmetycznej kwadratów liczb w buforze: | ||
+ | : <math>x_{SK} =\sqrt\frac{x_1^2 + x_2^2 + \cdots + x_n^2}{n}.</math> | ||
+ | |||
+ | |||
+ | * Zrób z powyższego kodu detektor przekroczenia pewnej ustalonej wartości RMS | ||
=== Filtrowanie online=== | === Filtrowanie online=== | ||
+ | Filtrowanie krótkich fragmentów sygnału jest kłopotliwe ze względu na efekty brzegowe. Dla sygnałów ciągłych dostarczanych w krótkich fragmentach ( w skrajnym przypadku próbka po próbce) problem ten można rozwiązać przekazując do funkcji filtrującej informacje dotyczące stanu filtra na poprzednim odcinku danych. Wywołanie | ||
+ | <source lang =py> y, zi = ss.lfilter(b, a, [s], zi=zi)</source> | ||
+ | powoduje przekazanie do funkcji lfilter pewnego stanu początkowego <code>zi</code> i odebranie zaktualizowanego stanu po przejści sygnału <code>s</code> przez filtr. | ||
+ | |||
+ | * Proszę porównać filtrowanie funkcją <code>lfilter</code> całego sygnału testowego naraz i podawanego po jednej próbce. Dla ustalenia uwagi niech będzie to filtr dolnoprzepustowy z częstością odcięcia 12Hz. Przygotować odpowiednie wizualizacje. | ||
+ | |||
+ | <hr> | ||
+ | === GRA === | ||
+ | Proszę ściągnąć i zapoznać się z kodem prostej gry w pythonie. | ||
+ | Uruchamia się ją poleceniem: | ||
+ | python breakout_mouse.py | ||
+ | po czym trzeba kliknąć w okienku z grą i położeniem myszy sterować paletką. | ||
+ | https://github.com/j-zygierewicz/Breakout_mouse/tree/main | ||
+ | Położenie myszy jest pobierane w 159 lini i aplikowane do położenia paletki w 160. | ||
+ | Na kolejnych zajęciach naszym celem będzie podpięcie sygnału przychodzącego ze wzmacniacza (po odpowiedniej analizie) do sterowania położeniem zamiast myszy. | ||
=== Ćwiczenie: Wykorzystanie pomiaru EMG do sterowania on-line === | === Ćwiczenie: Wykorzystanie pomiaru EMG do sterowania on-line === |
Aktualna wersja na dzień 19:22, 27 lut 2021
Spis treści
Sygnał testowy
Do zabawy w dalszych częściach zajęć przyda nam się jakiś sygnał testowy. Dla ustalenia uwagi niech będzie to suma trzech sinusoid, nieco zaszumiona generowana przez poniższy kod:
import scipy.signal as ss
import numpy as np
import matplotlib.pyplot as plt
Fs = 256
T = 5
t = np.arange(0,T,1/Fs)
f0 = 10
f1 = 17
f2 = 23
x = (np.sin(2*np.pi*f0*t) +
np.sin(2*np.pi*f1*t ) +
np.cos(2*np.pi*f2*t))
xn = x + np.random.randn(len(t)) * 0.08
plt.plot(xn)
plt.show()
Buforowanie: kolejka FIFO
W niektórych analizach wygodnie mieć fragment sygnału, który zawiera aktualnie otrzymane ze sterownika próbki sygnału wraz z pewnąliczbą poprzednich próbek. Do tego celu przydatna jest kolejka typu first-in-first-out (FIFO).
- Poroszę zaimplementować i zilustrować działanie kolejki FIFO, o długości
N_probek
.
Program powinien pokazywać cały sygnał testowy, a poniżej jego dotychczas otrzymany fragment i zaznaczony fragment znajdujący się w buforze kolejki.
- Proszę dopisać obliczanie i wykreślanie periodogramu dla aktualnego stanu kolejki.
Prosty detektor przekroczenia progu
- Z naszego sygnału testowego zróbmy sygnał o zmiennej mocy. Np. tak:
s = xn*(1-0.5*np.sin(2*np.pi*1*t))
plt.plot(s**2)
- Zaimplementuj przepuszczanie tego sygnału przez bufor FIFO. Dla każdego stanu bufora wylicz średnią kwadratową (ang. RMS root mean square):
czyli pierwiastek ze średniej arytmetycznej kwadratów liczb w buforze:
- [math]x_{SK} =\sqrt\frac{x_1^2 + x_2^2 + \cdots + x_n^2}{n}.[/math]
- Zrób z powyższego kodu detektor przekroczenia pewnej ustalonej wartości RMS
Filtrowanie online
Filtrowanie krótkich fragmentów sygnału jest kłopotliwe ze względu na efekty brzegowe. Dla sygnałów ciągłych dostarczanych w krótkich fragmentach ( w skrajnym przypadku próbka po próbce) problem ten można rozwiązać przekazując do funkcji filtrującej informacje dotyczące stanu filtra na poprzednim odcinku danych. Wywołanie
y, zi = ss.lfilter(b, a, [s], zi=zi)
powoduje przekazanie do funkcji lfilter pewnego stanu początkowego zi
i odebranie zaktualizowanego stanu po przejści sygnału s
przez filtr.
- Proszę porównać filtrowanie funkcją
lfilter
całego sygnału testowego naraz i podawanego po jednej próbce. Dla ustalenia uwagi niech będzie to filtr dolnoprzepustowy z częstością odcięcia 12Hz. Przygotować odpowiednie wizualizacje.
GRA
Proszę ściągnąć i zapoznać się z kodem prostej gry w pythonie. Uruchamia się ją poleceniem:
python breakout_mouse.py
po czym trzeba kliknąć w okienku z grą i położeniem myszy sterować paletką.
https://github.com/j-zygierewicz/Breakout_mouse/tree/main
Położenie myszy jest pobierane w 159 lini i aplikowane do położenia paletki w 160.
Na kolejnych zajęciach naszym celem będzie podpięcie sygnału przychodzącego ze wzmacniacza (po odpowiedniej analizie) do sterowania położeniem zamiast myszy.
Ćwiczenie: Wykorzystanie pomiaru EMG do sterowania on-line
Przykładowy fragment kodu example.py umożliwiający odbieranie sygnału on line w pythonie przedstawiony jest poniżej.
from obci_cpp_amplifiers.amplifiers import TmsiCppAmplifier
import numpy as np
amps = TmsiCppAmplifier.get_available_amplifiers('usb')
amp = TmsiCppAmplifier(amps[0])
amp.sampling_rate = 512
amp.start_sampling()
gains = np.array(amp.current_description.channel_gains)
offsets = np.array(amp.current_description.channel_offsets)
def samples_to_microvolts(samples): # z jednostek wzmacniacza do mikrowoltów
return samples * gains + offsets
while True:
# 16 próbek w pakiecie, nieodebrane próbki się bufurują i można odebrać je później
packet = amp.get_samples(16)
print(samples_to_microvolts(packet.samples))
print(packet.ts[0])
print(packet.samples.shape, amp.current_description.channel_names)
Aby wykonać go w terminalu należy uruchomić polecenie,
/opt/braintech/bin/python3 example.py
- Uwaga
- aby zadziałało trzeba wyłączyć SVAROGa.
Proszę przetestować czy po podłączeniu wzmacniacza i uruchomieniu tego skryptu pojawiają się w terminalu wartości próbek.