用 Python 计算互谱密度

PythonPythonBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在信号处理中,互谱密度(Cross Spectral Density,CSD)是频域中两个信号相关性的一种度量。它用于确定两个信号在频率成分方面的相互关联程度。在本实验中,你将学习如何使用 Python 的 Matplotlib 库计算两个信号的 CSD。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问 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)

## 固定随机状态以确保可重复性
np.random.seed(19680801)

nse1 = np.random.randn(len(t))                 ## 白噪声 1
nse2 = np.random.randn(len(t))                 ## 白噪声 2
r = np.exp(-t / 0.05)

cnse1 = np.convolve(nse1, r, mode='same') * dt   ## 有色噪声 1
cnse2 = np.convolve(nse2, r, mode='same') * dt   ## 有色噪声 2

## 两个具有相干部分和随机部分的信号
s1 = 0.01 * np.sin(2 * np.pi * 10 * t) + cnse1
s2 = 0.01 * np.sin(2 * np.pi * 10 * t) + cnse2

绘制信号

我们可以使用 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)

为了计算两个信号的互谱密度,我们需要使用 Matplotlib 的 csd 函数。该函数将两个信号、快速傅里叶变换(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 赫兹处显示出一个峰值,这是信号相干部分的频率。这表明两个信号在该频率下具有很强的相关性。

总结

在本实验中,你学习了如何使用 Python 的 Matplotlib 库来计算两个信号的互谱密度。我们生成了两个具有相干部分和随机部分的信号,绘制了这些信号,计算了互谱密度,并解读了结果。互谱密度是用于确定频域中两个信号之间相关性的有用工具。