Lab 02 - Akwizycja sygnału EMG- wprowadzenie
Transformata Fouriera sygnałów dyskretnych- splot, modulacja, okna
Wstęp
Delsys Trigno SDK
Moduły Delsys Trigno zawierają 1 kanałowy rejestrator EMG pracujący z częstotliwością 1259Hz oraz IMU (Akcelerometr +/116g, gyroskop +/-20000dps) pracujący z częstotliwościa 148Hz. Komunikacja z modułami dobywa się przez serwer (Delsys Trigno Controll Utility). Do komunikacji z serwerem możesz wykorzystać moduł pytringos ([email protected]:biolab-put/pytrignos.git)
przykłady uzycia znajdziesz w katalogu examples.
Inicjacja sensora
= TrignoAdapter()
trigno_sensors ='EMG', sensors_ids=(4,), sensors_labels=('EMG1',), host='192.168.4.118')
trigno_sensors.add_sensors(sensors_mode='ORIENTATION', sensors_ids=(4,), sensors_labels=('ORIENTATION1',), host='192.168.4.118') trigno_sensors.add_sensors(sensors_mode
class TrignoAdapter.add_sensor(sensor_mode, sensor_ids, sensor_labels, host)
sensors_mode : str
Rodzaj sensora do odczytu. (tj. 'ORIENTATION' lub 'EMG')
sensors_ids : tuple
Identyfikatory wykorzystanych modułów np. (1, 2,) będzie odczytywał dane z modułów 1 i 2
sensors_labels : tuple
Etykiety opisujące moduły w danych wyjściowych (kolumna 'Sensor_id') , np. ('ORIENTATION1', 'ORIENTATION2',).
host : str
Adres IP serwera Delsys Trigno Controll Utility
Akwizycja danych
Dane odczytywane z modułu sa buforowane i dostępne na żądanie. Poniższy kod odczytuje zgromadzone dane co 1s.
trigno_sensors.start_acquisition()
= 1.0 #s
time_period while(True):
time.sleep(time_period)= trigno_sensors.sensors_reading()
sensors_reading print(sensors_reading)
trigno_sensors.stop_acquisition()
Przebieg ćwiczenia
- Uruchom podstawowy kod z wprowadzenia (patrz również przykład). Numer IP serwera poda prowadzący, numer sensora jest opisany na obudowie modułu
- Uruchom kod umożlwiajacy odczyt danych z czujnika z wykorzystaniem FuncAnimation
- Sprawdź czy jesteś w stanie zaobserwować aktywność swoich mięśni przykładając czujnik np. do mięśnia odwodziciela kciuka i modulować napięce tego mięśnia
- Zarejestruj sygnał i przy wyjściu zapisz go do pliku (w formacie hdf)
- Zmodyfikuj funkcję wyświetlającą tak, by wyświetlała co 1s wyświetlała widmo sygnału, na osi x nanieś faktyczną częstotliwość
- Przeanalizuj poniższy kod w którym w celu ograniczenia wycieków widma stosuje się okno Hanna:
def spect_dB(s, N_fft, F_samp):
= fft(s,N_fft)
S = 20 * np.log10(np.abs(S))
S_dB = fftfreq(N_fft, 1.0/F_samp)
F return (S_dB,F)
=100
fs=5
f
plt.figure()
=1
kfor T in np.linspace(1,1.2,4):
= np.arange(0,T,1/fs)
t = signal.windows.hann(len(t))#
window = np.sin(2*np.pi*f*t)
s = s* window
s_wnd 4,1,k)
plt.subplot(f'T={T}')
plt.title(= spect_dB(s_wnd,len(s), fs)
S_wnd, F = spect_dB(s,len(s), fs)
S, F
plt.plot(F,S_wnd)
plt.plot(F,S)
=k+1 k
- Jak zmienia się widmo sygnału bez zastosowania okna Hann'a w zależności od długości sygnału?
- Przed wyznaczeniem widma wymnażaj sygnał EMG przez okno Hanna co zmienia się w widmie w porównaniu sygnałem nie wymnożonym?
Autorzy: Piotr Kaczmarek