Главная страница

Теор сигналов. Лаб_2_ТС. Лабораторна робота 2 з дисципліни Теорія сигналів Візуалізація сигналів з допомогою Python


Скачать 1.88 Mb.
НазваниеЛабораторна робота 2 з дисципліни Теорія сигналів Візуалізація сигналів з допомогою Python
АнкорТеор сигналов
Дата21.10.2020
Размер1.88 Mb.
Формат файлаdocx
Имя файлаЛаб_2_ТС.docx
ТипЛабораторна робота
#144621

Міністерство освіти і науки України

Національний технічний університет України

Київський політехнічний інститут”

Кафедра електронної інженерії

лабораторна РОБОТА № 2


з дисципліни «Теорія сигналів»

«Візуалізація сигналів з допомогою Python»


Студента 3 курсу,

групи ДМ-82

Іващук В.О

(прізвище та ініціали)
Київ – 2020

Мета роботи: набути навичок роботи з функціями зчитування та візуалізації даних різної природи в Python.

Порядок роботи

Увага!

Всі записи сигналів знаходяться на сайті.
На всіх графіках необхідно належним чином підписати вісі (виходячи із частоти дискретизації та фізичних величин, які вимірюються). Вісі повинні бути правильно промасштабовані.
Створити функцію, яка розраховує тривалість сигналів. З її допомогою визначити тривалості всіх сигналів, що використовуються в роботі.
1. Записати за допомогою смартфону сигнал з внутрішніх датчиків (акселерометр, гіроскоп та ін.) Для цього на смартфон попередньо встановити додаток AndroSensor:

https://play.google.com/store/apps/details?id=com.fivasim.androsensor&hl=en

Запустити додаток та опанувати його. Встановити в налаштуваннях «Оновлення даних» – «дуже швидко», «Інтервал запису» – встановити мінімальний доступний.

Виконати реєстрацію сигналів з доступних датчиків смартфону при виконанні таких вправ:

- записати сигнали стоячи, тримати пристрій в руці, яка опущена вздовж тулуба протягом 1 хвилини;

- почати запис, покласти пристрій в кишеню, постояти 10 секунд, пройти по коридору спокійним кроком, постояти 10 секунд, припинити запис;

- почати запис, покласти пристрій в кишеню, постояти 10 секунд, пробігти по коридору, постояти 10 секунд, припинити запис.

Зберегти дані в csv-файл, відкрити його з допомогою Python. Зберегти сигнали на диск для використання в наступних роботах.

Побудувати графіки сигналів акселерометра і гіроскопа, підписати вісі.
2. Записати звук з зовнішнього пристрою тривалістю 5 с допомогою Python. Записати однакові фрази або музику з частотою дискретизації 8 кГц та 44.1 кГц. Прочитати з файлу та прослухати отримані записи. Вивести графік, позначити вісі.
3. Прочитати сигнали ЕЕГ здорової та хворої людини, отримані з допомогою комп’ютерного електроенцефалографа та збережені у mat-файлі (MatLAB). Вивести графік, позначити вісі. Зберегти отриманий сигнал для використання в наступних роботах.

Файли архіву EEG_healthy.rar та EEG_sick.rar; обрати сигнал згідно номеру за списком; ЕЕГ дискретизована з частотою 256 Гц, значення напруги подано в мікровольтах.
4. Прочитати сигнали ЕКГ здорової (Norm) та хворої (anomaly) людини. Кожний файл має однакову структуру:

description - описа сигналу, може бути порожнім;

source - рядок, в якому вказане джерело походження файла, як правило "mitdb/200";

fs - частота дискретизації;

units - одиниці вимірювання сигнала;

signal - сам сигнал у вигляді numpy масиву;

labels - текстові мітки до сигналу;

labels_indexes - індекси відповідних міток;

source_start - додаткове поле, вказує на початок періоду в оригінальному сигналі, вказаному в source;

source_end - додаткове поле, вказує на кінець періоду в оригінальному сигналі, вказаному в source.

Побудувати графіки сигналів (*) та міток для відповідних ударів серця.
5. Прочитати сигнали кардіоритмограм здорової та хворої людини, збережені у mat-файлі. Вивести графік, позначити вісі. Значення сигналу записані в мілісекундах, кожний відлік відповідає інтервалу між ударами серця.

Визначити (програмно) тривалість записаного сигнала, взявши до уваги нерівномірну дискретизацію сигналу. Виконати інтерполяцію сигналу для визначення його значень на рівномірній сітці вузлів для частоти дискретизації 1 Гц.

Зберегти отриманий сигнал для використання в наступних роботах.

6. Прочитати сигнали стабілограми людини, що були зареєстровані за допомогою платформи Wii Balance Board (https://en.wikipedia.org/wiki/Wii_Balance_Board). В папці data присутні сигнали для двох груп спортсменів - гравців в гандбол та акробатів, handball та acrobats відповідно. Кожний тип спортсменів виконував певні експерименти:

  • base_close - стояти рівно, ноги разом, очі закриті

  • base_open - стояти рівно, ноги разом, очі відкриті

  • sway_front-back_30 - покачування вперед-назад під кутом 30 градусів, ноги разом, очі відкриті

  • sway_front_back_60 - покачування вперед-назад під кутом 60 градусів, ноги разом, очі відкриті

  • sway_left-right_30 - покачування вліво-вправо під кутом 30 градусів, ноги разом, очі відкриті

  • sway_left-right_60 - покачування вліво-вправо під кутом 60 градусів, ноги разом, очі відкриті

Виконати такі завдання:

  1. Прочитати сигнали CoP (Center-of-Pressure) стабілограм спортсменів, що спеціалізуються на різних видах спорту. Для цього пропонуємо використати функцію read_csv бібліотеки роботи з табличними даними Pandas. Побудувати графіки.

  2. Обрати будь-які два типи сигналів (наприклад base-open та sway_left-right_60) для двох типів спортсменів.

  3. Для кожного сигналу в папці відповідного типу порахувати статистичні параметри (середнє значення, медіанне значення, середнє квадратичне відхилення), окремо по осям Х та Y, звести в таблицю та порівняти для спортсменів різного типу.

  4. Зробити висновки.



7. Прочитати сигнали значення серцевого ритму (HR) та сатурації артеріальної крові киснем (SpO2). Побудувати графіки обох сигналів. Побудувати графіки середніх значень сигналів, які обраховані у вікнах тривалістю 30 сек., вікна не перекриваються.
8. Прочитати в робочу область сигнал внутрішньочерепного тиску. Зберегти отриманий сигнал для використання в наступних роботах. Файл TBI_ICP.txt, сигнал одноканальний, записаний з частотою дискретизації 125 Гц, одиниці виміру – ммHg), вивести графік на екран, позначити вісі.
9. Побудувати функцію для виводу на графік ділянки сигналів. В функцію передавати: час початку та закінчення ділянки (в секундах), вектор з відліками сигналу, частоту дискретизації. Передбачити перевірку правильності введення моментів часу, та можливість отримання за допомогою функції вектору з відліками ділянки сигналу та відліками часу.

Результати виконання:

Функція для знаходження тривалості сигналу:


def signal_time(signal,disfreq):

time = len(signal)/disfreq

return time

Завдання 1:

1. Записати за допомогою смартфону сигнал з внутрішніх датчиків (акселерометр, гіроскоп та ін.) Для цього на смартфон попередньо встановити додаток AndroSensor:

https://play.google.com/store/apps/details?id=com.fivasim.androsensor&hl=en

Запустити додаток та опанувати його. Встановити в налаштуваннях «Оновлення даних» – «дуже швидко», «Інтервал запису» – встановити мінімальний доступний.

Виконати реєстрацію сигналів з доступних датчиків смартфону при виконанні таких вправ:

- записати сигнали стоячи, тримати пристрій в руці, яка опущена вздовж тулуба протягом 1 хвилини;

- почати запис, покласти пристрій в кишеню, постояти 10 секунд, пройти по коридору спокійним кроком, постояти 10 секунд, припинити запис;

- почати запис, покласти пристрій в кишеню, постояти 10 секунд, пробігти по коридору, постояти 10 секунд, припинити запис.

Зберегти дані в csv-файл, відкрити його з допомогою Python. Зберегти сигнали на диск для використання в наступних роботах.

Побудувати графіки сигналів акселерометра і гіроскопа, підписати вісі.

Код:

import matplotlib.pyplot as plt

import csv
def print_axel_gyro_from_csv(file_obg):

time,Ax,Ay,Az,Gx,Gy,Gz = [],[],[],[],[],[],[]

with open(file_obg, newline='') as File:

reader1 = csv.reader(File,delimiter=';')

for row in reader1:

time.append(row[29])

Ax.append(row[0])

Ay.append(row[1])

Az.append(row[2])

Gx.append(row[9])

Gy.append(row[10])

Gz.append(row[11])

del Ax[0]

del Ay[0]

del Az[0]

del Gx[0]

del Gy[0]

del Gz[0]

del time[0]

time = [float(time1)/1000 for time1 in time]

Ax = [float(Ax1) for Ax1 in Ax]

Ay = [float(Ay1) for Ay1 in Ay]

Az = [float(Az1) for Az1 in Az]

Gx = [float(Gx1) for Gx1 in Gx]

Gy = [float(Gy1) for Gy1 in Gy]

Gz = [float(Gz1) for Gz1 in Gz]
fig, axm2 = plt.subplots(2,constrained_layout=True)
axm2[0].plot(time,Ax,time,Ay,time,Az)

axm2[0].set_title("Axeleromtr")

axm2[0].set_ylabel('Acceleration [m/s^2]')

axm2[0].set_xlabel('Time [s]')

axm2[1].plot(time,Gx,time,Gy,time,Gz)

axm2[1].set_title("Gyroscop")

axm2[1].set_ylabel('Angular velocity [rad/s]')

axm2[1].set_xlabel('Time [s]')

plt.show(block = False)
print_axel_gyro_from_csv('Sensor_record_20201004_134331_AndroSensor.csv')

print_axel_gyro_from_csv('Sensor_record_20201004_165847_AndroSensor.csv')

print_axel_gyro_from_csv('Sensor_record_20201004_170658_AndroSensor.csv')

plt.show()
Результати:



Завдання 2:

2. Записати звук з зовнішнього пристрою тривалістю 5 с допомогою Python. Записати однакові фрази або музику з частотою дискретизації 8 кГц та 44.1 кГц. Прочитати з файлу та прослухати отримані записи. Вивести графік, позначити вісі.

Код:

import librosa.display

import matplotlib.pyplot as plt

import pyaudio

import wave
p = pyaudio.PyAudio()

for i in range(p.get_device_count()):

print(i,p.get_device_info_by_index(i)['name'])

def record_sound(disfreq,time,output_name):

CHUNK = 1024

FORMAT = pyaudio.paInt16

CHANNELS = 2

RATE = disfreq

RECORD_SECONDS = time

WAVE_OUTPUT_FILENAME = output_name
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,

channels=CHANNELS,

rate=RATE,

input=True,

output=True,

input_device_index=1,

frames_per_buffer=CHUNK)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):

data = stream.read(CHUNK)

frames.append(data)
print("* done recording")
stream.stop_stream()

stream.close()

p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')

wf.setnchannels(CHANNELS)

wf.setsampwidth(p.get_sample_size(FORMAT))

wf.setframerate(RATE)

wf.writeframes(b''.join(frames))

wf.close()
def print_wawe(name_file,freq):

audio = name_file

x, sr = librosa.load(audio,sr = freq)
print(x.shape,sr)
plt.figure(figsize=(14, 6))

librosa.display.waveplot(x, sr=sr)

plt.title('Frequency: '+str(freq))

plt.ylabel('Amplitude')

plt.xlabel('Time[s]')

plt.show(block=False)
record_sound(44100,5,'output1.wav')

record_sound(8000,5,'output2.wav')

print_wawe('output1.wav',44100)

print_wawe('output2.wav',8000)
plt.show()

Результат:





Завдання 3:

3. Прочитати сигнали ЕЕГ здорової та хворої людини, отримані з допомогою комп’ютерного електроенцефалографа та збережені у mat-файлі (MatLAB). Вивести графік, позначити вісі. Зберегти отриманий сигнал для використання в наступних роботах.

Файли архіву EEG_healthy.rar та EEG_sick.rar; обрати сигнал згідно номеру за списком; ЕЕГ дискретизована з частотою 256 Гц, значення напруги подано в мікровольтах.
Код:

import matplotlib.pyplot as plt

import numpy as np

from mat4py import loadmat
ind = 0
def print_matdata(file_name,disfreq):

global ind

ind += 1

data = loadmat(file_name)

a = data.get('sig')

time = len(a)/disfreq

x1 = np.arange(0,time,1/disfreq)

plt.figure(figsize=(14,6))

plt.plot(x1,a)

plt.xlabel('Time[s]')

plt.ylabel('Voltage[μV]')

plt.show(block=False)

np.save('save/save_p2_'+str(ind),a)

np.save('save/save_p2_disfreq_' + str(ind), disfreq)

print_matdata('eeg_healthy_7.mat',256)

print_matdata('eeg_sick_7.mat',256)

plt.show()
Результат:


Зав
Завдання 4:

4. Прочитати сигнали ЕКГ здорової (Norm) та хворої (anomaly) людини. Кожний файл має однакову структуру:

description - описа сигналу, може бути порожнім;

source - рядок, в якому вказане джерело походження файла, як правило "mitdb/200";

fs - частота дискретизації;

units - одиниці вимірювання сигнала;

signal - сам сигнал у вигляді numpy масиву;

labels - текстові мітки до сигналу;

labels_indexes - індекси відповідних міток;

source_start - додаткове поле, вказує на початок періоду в оригінальному сигналі, вказаному в source;

source_end - додаткове поле, вказує на кінець періоду в оригінальному сигналі, вказаному в source.

Побудувати графіки сигналів (*) та міток для відповідних ударів серця.
Код:

import matplotlib.pyplot as plt

import numpy as np

arr_of_name = []
def save_name_file(file_name):

global arr_of_name

arr_of_name.append(file_name)
def print_all_in_arr(arr_name):

plt.fig, axes = plt.subplots(nrows = len(arr_name), ncols =1,constrained_layout=True ,figsize=(12,6))

int1 = np.arange(0,len(arr_name),1)

for i in int1:

a = np.load(arr_name[i])

freqdis = a['fs']

signal = a['signal']

x = np.arange(0, len(signal), 1)

time = [i / freqdis for i in x]

labels = a['labels']

labels_index = a['labels_indexes']

axes[i].plot(time,signal)

for j in np.arange(0,len(labels_index),1):

axes[i].text(labels_index[j]/freqdis,signal[labels_index[j]],str(labels[j]))

axes[i].set_xlabel('Time[ms]')

axes[i].set_ylabel(str(a['units']))

save_name_file('norm/1600715304.npz') #norm

save_name_file('norm/1600714751.npz') #

save_name_file('anomaly/1600715425.npz') #

save_name_file('anomaly/1600715425.npz') #
print_all_in_arr(arr_of_name)

plt.show()
Результат:




Завдання 5:

5. Прочитати сигнали кардіоритмограм здорової та хворої людини, збережені у mat-файлі. Вивести графік, позначити вісі. Значення сигналу записані в мілісекундах, кожний відлік відповідає інтервалу між ударами серця.

Визначити (програмно) тривалість записаного сигнала, взявши до уваги нерівномірну дискретизацію сигналу. Виконати інтерполяцію сигналу для визначення його значень на рівномірній сітці вузлів для частоти дискретизації 1 Гц.

Зберегти отриманий сигнал для використання в наступних роботах.

Код:

import matplotlib.pyplot as plt

import numpy as np

from mat4py import loadmat
arr_of_name = []
def save_name_file(file_name):

global arr_of_name

arr_of_name.append(file_name)
def print_all_in_arr(arr_name):

plt.fig, axes = plt.subplots(nrows = len(arr_name), ncols =1,constrained_layout=True ,figsize=(12,4))

int = np.arange(0,len(arr_name),1)

for i in int:

data = loadmat(arr_name[i])

a = data.get('d')

x1 = np.arange(0, len(a), 1)

time = [x2/1000 for x2 in x1]

axes[i].plot(time, a)

axes[i].set_xlabel('Time[s]')

axes[i].set_ylabel('Voltage[μV]')

save_name_file('ECG_rec/ecg_1.mat') #norm

save_name_file('ECG_rec/ecg_3.mat') #

print_all_in_arr(arr_of_name)

plt.show()
Результат:


Завдання 6:

6. Прочитати сигнали стабілограми людини, що були зареєстровані за допомогою платформи Wii Balance Board (https://en.wikipedia.org/wiki/Wii_Balance_Board). В папці data присутні сигнали для двох груп спортсменів - гравців в гандбол та акробатів, handball та acrobats відповідно. Кожний тип спортсменів виконував певні експерименти:

  • base_close - стояти рівно, ноги разом, очі закриті

  • base_open - стояти рівно, ноги разом, очі відкриті

  • sway_front-back_30 - покачування вперед-назад під кутом 30 градусів, ноги разом, очі відкриті

  • sway_front_back_60 - покачування вперед-назад під кутом 60 градусів, ноги разом, очі відкриті

  • sway_left-right_30 - покачування вліво-вправо під кутом 30 градусів, ноги разом, очі відкриті

  • sway_left-right_60 - покачування вліво-вправо під кутом 60 градусів, ноги разом, очі відкриті

Виконати такі завдання:

  1. Прочитати сигнали CoP (Center-of-Pressure) стабілограм спортсменів, що спеціалізуються на різних видах спорту. Для цього пропонуємо використати функцію read_csv бібліотеки роботи з табличними даними Pandas. Побудувати графіки.

  2. Обрати будь-які два типи сигналів (наприклад base-open та sway_left-right_60) для двох типів спортсменів.

  3. Для кожного сигналу в папці відповідного типу порахувати статистичні параметри (середнє значення, медіанне значення, середнє квадратичне відхилення), окремо по осям Х та Y, звести в таблицю та порівняти для спортсменів різного типу.

  4. Зробити висновки.


Код:

import csv

import numpy as np

import matplotlib.pyplot as plt

import os

directory = 'data'
for filename in os.listdir(directory):

for filename2 in os.listdir(directory + '/' +str(filename)):

for filename3 in os.listdir(directory + '/' +str(filename) + '/'+ str(filename2)):

filename_end = directory + '/' +str(filename) + '/'+ str(filename2) + '/' + filename3

print(filename_end)

x = []

y = []

y1 = []

y2 = []

y3 = []

y4 = []

y5 = []

y6 = []
with open(str(filename_end), newline='') as File:

reader1 = csv.reader(File, delimiter=';')

for row in reader1:

a = row[0].split(' ')

x.append(float(a[0]))

y.append(float(a[1]))

y1.append(float(a[2]))

y2.append(float(a[3]))

y3.append(float(a[4]))

y4.append(float(a[5]))

y5.append(float(a[6]))

y6.append(float(a[7]))

time = [(x1 - x[0]) / 1000 for x1 in x]

medium_x = 1/len(time)*sum(time)

print(medium_x)
arr_of_name = []
def save_name_file(file_name):

global arr_of_name

arr_of_name.append(file_name)
def print_stabilog(arr_name):

plt.fig, axes = plt.subplots(nrows=len(arr_name), ncols=1, constrained_layout=True, figsize=(12, 6))

int1 = np.arange(0, len(arr_name), 1)

for i in int1:

x = []

y = []

y1 = []

y2 = []

y3 = []

y4 = []

y5 = []

y6 = []
with open(arr_of_name[i], newline='') as File:

reader1 = csv.reader(File, delimiter=';')

for row in reader1:

a = row[0].split(' ')

x.append(float(a[0]))

y.append(float(a[1]))

y1.append(float(a[2]))

y2.append(float(a[3]))

y3.append(float(a[4]))

y4.append(float(a[5]))

y5.append(float(a[6]))

y6.append(float(a[7]))

time = [(x1-x[0])/1000 for x1 in x]

axes[i].plot(time,y,time,y1,time,y2,time,y3,time,y4,time,y5,time,y6)

axes[i].set_title(arr_of_name[i])

plt.xlabel('Time[s]')

save_name_file('data/acrobats/base_open/2.csv')

save_name_file('data/acrobats/sway_left-right_60/1.csv')

save_name_file('data/handball/base_open/1.csv')

save_name_file('data/handball/sway_left-right_30/10.csv')
print_stabilog(arr_of_name)

plt.show()
Результат:

Завдання 7:

7. Прочитати сигнали значення серцевого ритму (HR) та сатурації артеріальної крові киснем (SpO2). Побудувати графіки обох сигналів. Побудувати графіки середніх значень сигналів, які обраховані у вікнах тривалістю 30 сек., вікна не перекриваються.
Код:

import csv

import numpy as np

import matplotlib.pyplot as plt
def print_stabilog(file_name):

El_time = []

SpO2 = []

hr = []

n = []

with open(file_name, newline='') as File:

reader1 = csv.reader(File, delimiter=';')

for row in reader1:

a = row[0].split(',')

n.append((a[0]))

El_time.append((a[1]))

SpO2.append((a[2]))

hr.append((a[3]))
del El_time[0]

del SpO2[0]

del hr[0]

El_time = [float(a) for a in El_time]

SpO2 = [float(a) for a in SpO2]

hr = [float(a) for a in hr]
plt.plot(El_time,SpO2,El_time,hr)

plt.show()

print_stabilog('Subject7_SpO2Hr.csv')

Результат:


Завдання 8:

8. Прочитати в робочу область сигнал внутрішньочерепного тиску. Зберегти отриманий сигнал для використання в наступних роботах. Файл TBI_ICP.txt, сигнал одноканальний, записаний з частотою дискретизації 125 Гц, одиниці виміру – ммHg), вивести графік на екран, позначити вісі.

Код:

import csv

import numpy as np

import matplotlib.pyplot as plt
def print_stabilog(file_name):

El_time = []

SpO2 = []

hr = []

n = []

with open(file_name, newline='') as File:

reader1 = csv.reader(File, delimiter=';')

for row in reader1:

a = row[0].split(',')

n.append((a[0]))

El_time.append((a[1]))

SpO2.append((a[2]))

hr.append((a[3]))
del El_time[0]

del SpO2[0]

del hr[0]

El_time = [float(a) for a in El_time]

SpO2 = [float(a) for a in SpO2]

hr = [float(a) for a in hr]
plt.plot(El_time,SpO2,El_time,hr)

plt.show()

print_stabilog('Subject7_SpO2Hr.csv')
Результат:


Завдання 9:

9. Побудувати функцію для виводу на графік ділянки сигналів. В функцію передавати: час початку та закінчення ділянки (в секундах), вектор з відліками сигналу, частоту дискретизації. Передбачити перевірку правильності введення моментів часу, та можливість отримання за допомогою функції вектору з відліками ділянки сигналу та відліками часу.


Код:

import numpy as np

import matplotlib.pyplot as plt

def print_part_signal(time_start,time_end,signal,disfreq):

y = []

if time_end > len(signal)/disfreq:

print('Time_end out from range')

return True

elif time_start > time_end:

print('time_start > time_end')

return True

x = np.arange(time_start, time_end, 1 / disfreq)

for i in range(0,len(x),1):

y.append(signal[i+int(time_start*disfreq)])

plt.plot(x,y)

plt.grid(True)

plt.show()
a = np.load('norm/1600714751.npz')

disfreq = a['fs']

signal = a['signal']
print_part_signal(3,5,signal,disfreq)
Результат:



Висновки:

На цій роботі було розглянуті основні методи виводу і зображення сигналів. Було розглянуто велику кількість сигналів збережених у різних форматах. Також ми вчилися виконувати елементарні операції з сигналами, визначати їх тривалість і, також був невеличкий аналіз цих результатів.


написать администратору сайта