МОСКОВСКИЙ ИНСТИТУТ ЭЛЕКТРОННОЙ ТЕХНИКИ
Институт системной и программной инженерии и информационных технологий (Институт СПИНТех)
Лабораторная работа № 1
Трудоёмкость алгоритма обработки данных.
Моделирование функций активации нейрона
Выполнил:
Фамилия И.О. гр. ???-??
Проверил преподаватель:
проф., д.ф.-м. н. Рычагов М.Н.
Москва, 2026
Задание №1
Код:
# Lab_1_1.ipynb (Python версия) # Дисциплина: Нейронные сети для инженеров # Лабораторная работа 1 # Обновлённая версия: генерация сигнала, ДПФ, обратное ДПФ и визуализация import numpy as np import matplotlib.pyplot as plt ## Параметры сигнала A = float(input('Введите амплитуду сигнала, ед.: ')) f0 = float(input('Введите частоту сигнала, Гц: ')) phi = float(input('Введите фазу сигнала, рад: ')) NT = int(input('Введите количество периодов наблюдения: ')) mvis = int(input('Введите коэффициент увеличения дискретизации: ')) ## Дискретизация T = 1 / f0 # Период сигнала fdn = 2 * f0 # Частота Найквиста-Котельникова fdv = mvis * fdn # Частота дискретизации для визуализации dt = 1 / fdv # Интервал дискретизации Tnab = NT * T # Время наблюдения t = np.arange(0, Tnab, dt) # Вектор времени # Сигнал y = A * np.cos(2 * np.pi * f0 * t + phi) ## Прямое ДПФ N = len(y) k = np.arange(N) Ex = np.exp(-1j * 2 * np.pi / N * np.outer(k, k)) Y = y @ Ex ## Обратное ДПФ Ex_inv = np.exp(1j * 2 * np.pi / N * np.outer(k, k)) ys = (Y @ Ex_inv) / N ## Частотный вектор ff = k * fdv / N Y2 = np.abs(Y) ** 2 # Квадрат модуля спектра ## Визуализация сигналов plt.figure(figsize=(12, 8)) plt.subplot(2, 2, 1) plt.plot(t, np.real(y), 'r') plt.title('Исходный сигнал (действительная часть)') plt.xlabel('Время, с') plt.ylabel('Амплитуда') plt.subplot(2, 2, 2) plt.plot(t, np.imag(y), 'b') plt.title('Исходный сигнал (мнимая часть - должна быть 0)') plt.xlabel('Время, с') plt.ylabel('Амплитуда') plt.subplot(2, 2, 3) plt.plot(t, np.real(ys), 'r') plt.title('Восстановленный сигнал (действительная часть)') plt.xlabel('Время, с') plt.ylabel('Амплитуда') plt.subplot(2, 2, 4) plt.plot(t, np.imag(ys), 'b') plt.title('Восстановленный сигнал (мнимая часть)') plt.xlabel('Время, с') plt.ylabel('Амплитуда') plt.tight_layout() plt.show() ## Визуализация спектра plt.figure() plt.plot(ff, Y2, 'r') plt.title('Спектр сигнала') plt.xlabel('Частота, Гц') plt.ylabel('|Y(f)|^2') plt.grid() plt.show() print('********** Конец работы **********')
Пояснение:
Программа реализует прямое и обратное дискретное преобразование Фурье (ДПФ). Коэффициент увеличения дискретизации влияет на количество точек получаемого графика (Рис. 1). По критерию Найквиста-Котельникова частота дискретизации должна быть в 2 раза больше самой высокой частоты в сигнале (в данном случае частота одна). Оператор суммы из формул (16) и (17) исчезает за счёт использования функции outer из библиотеки numpy и оператора @ (матричное умножение).
Рисунок 1. Отображение сигнала при коэффициенте увеличения дискретизации: 1 (а), 5 (б), 100 (в)
Задание №2
Код для части а):
from enum import Enum import numpy as np import matplotlib.pyplot as plt class Signal(Enum): COS = "косинус" SIN = "синус" ## Параметры сигнала f0 = 2000.0 # Частота fdn = 100 * f0 # Частота дискретизации dt = 1 / fdn # Интервал дискретизации signal = Signal.COS # Сигнал ## Данные для заданного интервала наблюдения Tnab_const = 0.005 # Время наблюдения t_dt = np.arange(0, Tnab_const, dt) ## Данные для заданного количества точек points_count = 512 # Количество точек Tnab = points_count * dt t_points = np.arange(0, Tnab, dt) ## Сигнал if signal == Signal.COS: y_dt = np.cos(2 * np.pi * f0 * t_dt) y_points = np.cos(2 * np.pi * f0 * t_points) else: y_dt = np.sin(2 * np.pi * f0 * t_dt) y_points = np.sin(2 * np.pi * f0 * t_points) ## Визуализация сигналов fig = plt.figure(figsize=(12, 8)) plt.subplot(2, 1, 1) plt.plot(t_dt, y_dt, 'r') plt.title(f'Визуализация для интервал наблюдения: {Tnab_const}') plt.xlabel('Время, с') plt.ylabel('Амплитуда') plt.grid() plt.subplot(2, 1, 2) plt.plot(t_points, y_points, 'r') plt.title(f'Визуализация для количества точек: {points_count}') plt.xlabel('Время, с') plt.ylabel('Амплитуда') plt.grid() fig.suptitle(f'Исходный сигнал: {signal.value}') plt.tight_layout() plt.show()
Вывод:
Рисунок 2. Визуализация функции косинуса с частотой 2 кГц
Рисунок 3. Визуализация функции синуса с частотой 2 кГц
Код для частей б) и в):
from enum import Enum import numpy as np import matplotlib.pyplot as plt class Signal(Enum): COS = "косинус" SIN = "синус" ## Параметры сигнала f0 = 2000.0 # Частота fdn = 10 * f0 # Частота дискретизации dt = 1 / fdn # Интервал дискретизации signal = Signal.COS # Сигнал NT = 5 # Количество периодов наблюдения ## Дискретизация T = 1 / f0 # Период сигнала Tnab = NT * T # Время наблюдения t = np.arange(0, Tnab, dt) # Вектор времени ## Данные для заданного количества точек # points_count = 128 # Количество точек # Tnab = points_count * dt # t = np.arange(0, Tnab, dt) ## Данные для заданного интервала наблюдения # Tnab_const = 0.1 # Время наблюдения # t = np.arange(0, Tnab_const, dt) ## Сигнал if signal == Signal.COS: y = np.cos(2 * np.pi * f0 * t) else: y = np.sin(2 * np.pi * f0 * t) N = len(y) k = np.arange(N) ## Прямое ДПФ Ex = np.exp(-1j * 2 * np.pi / N * np.outer(k, k)) Y_DFT = y @ Ex ## Прямое БПФ Y_FFT = np.fft.fft(y) ## Частотный вектор ff = k * fdn / N Y2_DFT = np.abs(Y_DFT) ** 2 # Квадрат модуля спектра Y2_FFT = np.abs(Y_FFT) ** 2 # Квадрат модуля спектра ## Визуализация сигналов fig = plt.figure(figsize=(12, 8)) plt.subplot(2, 1, 1) plt.plot(ff, np.real(Y_DFT), 'r', label = 'DFT') plt.plot(ff, np.real(Y_FFT), 'b--', label = 'FFT') plt.title('Действительная часть') plt.xlabel('Частота, Гц') plt.ylabel('Амплитуда') plt.legend() plt.grid() plt.subplot(2, 1, 2) plt.plot(ff, np.imag(Y_DFT), 'r', label = 'DFT') plt.plot(ff, np.imag(Y_FFT), 'b--', label = 'FFT') plt.title('Мнимая часть') plt.xlabel('Частота, Гц') plt.ylabel('Амплитуда') plt.legend() plt.grid() fig.suptitle(f'Фурье-образ исходного сигнала: {signal.value}') plt.tight_layout() plt.show() plt.plot(ff, Y2_DFT, 'r', label = 'DFT') plt.plot(ff, Y2_FFT, 'b--', label = 'FFT') plt.title('Квадрат модуля фурье-образа') plt.xlabel('Частота, Гц') plt.ylabel('|Y(f)|^2') plt.legend() plt.grid() plt.show()
Вывод:
Рисунок 4. Сравнение действительных и мнимых частей фурье-образов косинуса, полученных при помощи ДПФ и БПФ
Рисунок 5. Сравнение квадратов модулей фурье-образов косинуса, полученных при помощи ДПФ и БПФ
Рисунок 6. Сравнение действительных и мнимых частей фурье-образов синуса, полученных при помощи ДПФ и БПФ
Рисунок 7. Сравнение квадратов модулей фурье-образов косинуса, полученных при помощи ДПФ и БПФ
Код для оставшейся части задания:
from enum import Enum import numpy as np import matplotlib.pyplot as plt import time class Signal(Enum): COS = "косинус" SIN = "синус" ## Параметры сигнала f0 = 2000.0 # Частота fdn = 10 * f0 # Частота Найквиста-Котельникова dt = 1 / fdn # Интервал дискретизации signal = Signal.COS # Сигнал DFT_time = {} FFT_time = {} ## Данные для заданного количества точек for i in range(7, 13): points_count = 2 ** i # Количество точек Tnab = points_count * dt t = np.arange(0, Tnab, dt) ## Сигнал if signal == Signal.COS: y = np.cos(2 * np.pi * f0 * t) else: y = np.sin(2 * np.pi * f0 * t) N = len(y) k = np.arange(N) ## Прямое ДПФ start = time.time() Ex = np.exp(-1j * 2 * np.pi / N * np.outer(k, k)) Y_DFT = y @ Ex elapsed = time.time() - start DFT_time.update({points_count: elapsed}) ## Прямое БПФ start = time.time() Y_FFT = np.fft.fft(y) elapsed = time.time() - start FFT_time.update({points_count: elapsed}) ## График plt.plot(list(DFT_time.keys()), list(DFT_time.values()), 'r', label="ДПФ") plt.plot(list(FFT_time.keys()), list(FFT_time.values()), 'b', label="БПФ") plt.title('График зависимости времени обработки исходных данных') plt.xlabel('Количество исходных данных') plt.ylabel('Время, с') plt.legend() plt.grid() plt.show()
Вывод:
Рисунок 8. График зависимости времени обработки исходных данных, исходный сигнал: косинус
Рисунок 9. График зависимости времени обработки исходных данных, исходный сигнал: синус
