Генерация и визуализация синусоидальных сигналов с использованием Python

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии мы проведем вас по генерации и визуализации синусоидального сигнала с добавленным шумом с использованием библиотеки Matplotlib для Python. В частности, мы создадим разные представления спектра сигнала с использованием быстрого преобразования Фурье (FFT).

Советы по работе с ВМ

После запуска виртуальной машины нажмите в верхнем левом углу, чтобы переключиться на вкладку Ноутбук, чтобы получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем необходимые библиотеки

Сначала нам нужно импортировать необходимые библиотеки. Будем использовать NumPy и Matplotlib.

import matplotlib.pyplot as plt
import numpy as np

Задаем переменные

Далее мы зададим переменные для нашего сигнала. Будем использовать интервал дискретизации 0.01, что дает частоту дискретизации 100 Гц. Создадим массив времени от 0 до 10 секунд с шагом 0.01 секунды. Также сгенерируем шум с использованием функции randn библиотеки NumPy и св卷积руем его с функцией экспоненциального затухания, чтобы создать помехированный сигнал.

np.random.seed(0)

dt = 0.01  ## интервал дискретизации
Fs = 1 / dt  ## частота дискретизации
t = np.arange(0, 10, dt)

## генерируем шум:
nse = np.random.randn(len(t))
r = np.exp(-t / 0.05)
cnse = np.convolve(nse, r) * dt
cnse = cnse[:len(t)]

s = 0.1 * np.sin(4 * np.pi * t) + cnse  ## сигнал

Создаем графики

Теперь мы создадим графики для наших различных представлений спектра. Используем функцию subplots библиотеки Matplotlib для создания сетки графиков размером 3x2. В первом графике будем отображать временной сигнал, а в оставшихся - различные виды спектров.

fig, axs = plt.subplots(nrows=3, ncols=2, figsize=(7, 7))

## рисуем временной сигнал:
axs[0, 0].set_title("Signal")
axs[0, 0].plot(t, s, color='C0')
axs[0, 0].set_xlabel("Time")
axs[0, 0].set_ylabel("Amplitude")

## рисуем различные виды спектров:
axs[1, 0].set_title("Magnitude Spectrum")
axs[1, 0].magnitude_spectrum(s, Fs=Fs, color='C1')

axs[1, 1].set_title("Log. Magnitude Spectrum")
axs[1, 1].magnitude_spectrum(s, Fs=Fs, scale='dB', color='C1')

axs[2, 0].set_title("Phase Spectrum ")
axs[2, 0].phase_spectrum(s, Fs=Fs, color='C2')

axs[2, 1].set_title("Angle Spectrum")
axs[2, 1].angle_spectrum(s, Fs=Fs, color='C2')

axs[0, 1].remove()  ## не отображаем пустой ax

fig.tight_layout()
plt.show()

Интерпретация графиков

Мы можем увидеть, что первый график показывает сигнал в时域. Второй график показывает амплитудный спектр сигнала, который сообщает нам о силе различных частотных компонентов в сигнале. Третий график показывает логарифмический амплитудный спектр, который полезен для визуализации всего спектра, когда есть очень большие и очень маленькие значения. Четвертый график показывает фазовый спектр, который сообщает нам о фазовом сдвиге каждой частотной компоненты в сигнале. Наконец, пятый график показывает угловой спектр, который похож на фазовый спектр, но использует радианы вместо градусов.

Резюме

В этом практическом занятии мы сгенерировали синусоидальный сигнал с добавленным шумом и создали различные представления спектра этого сигнала с использованием библиотеки Matplotlib для Python. Мы узнали, как интерпретировать различные виды спектров и как они могут быть полезны при анализе сигналов.