Вычисление кросс-спектральной плотности в Python

Beginner

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

Введение

В обработке сигналов кросс-спектральная плотность (Cross Spectral Density, CSD) является мерой корреляции между двумя сигналами в частотной области. Она используется для определения степени связи между двумя сигналами с точки зрения их частотного содержания. В этом лабораторном занятии вы научитесь вычислять CSD двух сигналов с использованием библиотеки Matplotlib в Python.

Советы по виртуальной машине

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

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

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

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

Нам нужно импортировать следующие библиотеки: numpy и matplotlib.pyplot.

import matplotlib.pyplot as plt
import numpy as np

Генерация сигналов

Нам нужно сгенерировать два сигнала. Эти сигналы содержат когерентную часть и случайную часть. Когерентная часть обоих сигналов имеет частоту 10 Гц. Случайная часть сигналов генерируется с использованием белого шума, который пропускается через низкочастотный фильтр для создания цветного шума.

dt = 0.01
t = np.arange(0, 30, dt)

## Fixing random state for reproducibility
np.random.seed(19680801)

nse1 = np.random.randn(len(t))                 ## white noise 1
nse2 = np.random.randn(len(t))                 ## white noise 2
r = np.exp(-t / 0.05)

cnse1 = np.convolve(nse1, r, mode='same') * dt   ## colored noise 1
cnse2 = np.convolve(nse2, r, mode='same') * dt   ## colored noise 2

## two signals with a coherent part and a random part
s1 = 0.01 * np.sin(2 * np.pi * 10 * t) + cnse1
s2 = 0.01 * np.sin(2 * np.pi * 10 * t) + cnse2

Построение графиков сигналов

Мы можем построить графики двух сгенерированных сигналов с использованием функции plot библиотеки Matplotlib.

fig, ax = plt.subplots()
ax.plot(t, s1, label='s1')
ax.plot(t, s2, label='s2')
ax.set_xlabel('Time')
ax.set_ylabel('Amplitude')
ax.legend()
plt.show()

Вычисление кросс-спектральной плотности (CSD)

Для вычисления кросс-спектральной плотности (Cross Spectral Density, CSD) двух сигналов нам нужно использовать функцию csd библиотеки Matplotlib. Функция принимает два сигнала, количество точек для быстрого преобразования Фурье (FFT) и частоту дискретизации в качестве входных параметров.

fig, ax = plt.subplots()
cxy, f = ax.csd(s1, s2, 256, 1. / dt)
ax.set_ylabel('CSD (dB)')
plt.show()

Интерпретация результатов

Полученный график показывает кросс-спектральную плотность (CSD) двух сигналов. По оси x отложена частота, а по оси y - сила корреляции между двумя сигналами на данной частоте. На графике наблюдается пик на частоте 10 Гц, которая соответствует частоте когерентной части сигналов. Это указывает на то, что два сигнала сильно коррелированы на этой частоте.

Резюме

В этом практическом занятии (лабораторной работе) вы научились вычислять кросс-спектральную плотность (Cross Spectral Density) двух сигналов с использованием библиотеки Matplotlib в Python. Мы сгенерировали два сигнала, состоящие из когерентной и случайной частей, построили графики этих сигналов, вычислили кросс-спектральную плотность и проинтерпретировали результаты. Кросс-спектральная плотность - полезный инструмент для определения корреляции между двумя сигналами в частотной области.