Calcular a Densidade Espectral Cruzada em Python

Beginner

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

Introdução

Em processamento de sinais, a Densidade Espectral Cruzada (CSD - Cross Spectral Density) é uma medida da correlação entre dois sinais no domínio da frequência. Ela é utilizada para determinar o quanto dois sinais estão relacionados entre si em termos de seu conteúdo de frequência. Neste laboratório, você aprenderá como calcular a CSD de dois sinais usando a biblioteca Matplotlib do Python.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar as Bibliotecas Necessárias

Precisamos importar as seguintes bibliotecas: numpy e matplotlib.pyplot.

import matplotlib.pyplot as plt
import numpy as np

Gerar Sinais

Precisamos gerar dois sinais. Esses sinais contêm uma parte coerente e uma parte aleatória. A parte coerente de ambos os sinais tem uma frequência de 10 Hz. A parte aleatória dos sinais é gerada usando ruído branco que é passado por um filtro passa-baixas para criar ruído colorido.

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

Plotar Sinais

Podemos plotar os dois sinais gerados usando a função plot do 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()

Calcular CSD

Para calcular a CSD (Cross Spectral Density) de dois sinais, precisamos usar a função csd do Matplotlib. A função recebe os dois sinais, o número de pontos para a FFT (Fast Fourier Transform) e a frequência de amostragem como entradas.

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

Interpretar os Resultados

O gráfico resultante mostra a CSD (Cross Spectral Density) dos dois sinais. O eixo x representa a frequência e o eixo y representa a força da correlação entre os dois sinais naquela frequência. O gráfico mostra um pico em 10 Hz, que é a frequência da parte coerente dos sinais. Isso indica que os dois sinais estão fortemente correlacionados nessa frequência.

Resumo

Neste laboratório, você aprendeu como calcular a Densidade Espectral Cruzada (Cross Spectral Density) de dois sinais usando a biblioteca Matplotlib do Python. Geramos dois sinais com uma parte coerente e uma parte aleatória, plotamos os sinais, calculamos a CSD e interpretamos os resultados. A CSD é uma ferramenta útil para determinar a correlação entre dois sinais no domínio da frequência.