Python Periodogram

2024 年 8 月 29 日 | 4 分钟阅读

引言

  • 信号的功率谱密度(PSD)描绘了其功率在不同频率上的分布情况。它在许多技术学科的信号处理中都有应用。
  • PSD 用于评估通信系统(如无线电和雷达)的信道占用情况及相关频率。PSD 广泛用于频谱分析,以估计信号强度在频率范围内的分布。

周期图

  • 周期图是一种用于离散时间信号的 PSD。在本节中,我们将专注于周期图,因为这在数字系统的信号处理中很常见。
  • 下面简要介绍了 PSD 和周期图的定义。然后,我们将使用重要的信号处理库 scipy 和 matplotlib 来了解如何在 Python 中计算 PSD。

功率谱密度

我们直接从离散时间信号开始,跳过从连续信号开始的整个自顶向下的场景。我们的数据经常被采样;因此,我们在实践中采用的是离散时间处理。

考虑一个离散信号,其中是信号的长度。这可以是整个信号,也可以是更大信号的长度为的窗口。

我们还假设信号以采样频率进行采样,其中是以秒为单位的样本之间的时间间隔。

Python PSD 解决方案

测试数据

在计算实际 PSD 之前,我们需要生成一些测试数据。为此,我们使用了两个频率分别为 10Hz 和 60Hz 的正弦波。然后,我们引入了一些高斯噪声,看看是否能从数据中分离出这两个频率分量。

代码

测试设置配置。

使用 Scipy

标准的信号分析包 scipy.signal.periodogram 是一个方便的计算周期图的实现。我们可以使用此方法简单地确定功率谱密度。Scipy 易于使用;我们只需要为 periodogram 方法提供真实的信号数据和采样频率。为确保该过程返回 PSD 而不是功率谱,我们还设置了 scaling='density'。

该方法产生频率分量和相应的功率密度。

绘制数据

在各自的 10Hz 和 60Hz 频率下,我们可以轻松区分这两个频率分量。两者具有相同的幅度,考虑到正弦波的幅度,这是合理的。

使用 Scipy 和 Welch 方法估计 PSD

对于长传输,PSD 的计算可能非常耗时。一种著名的估计 PSD 的方法是 Welch 方法。Scipy 也提供了一种易于使用的此估计策略的方法。

可以看出,Welch 的方法相当准确地估计了我们测试信号的幅度和频率分量。可以轻松地从噪声中区分出正确的频率分量。

通过增加段长度,我们可以获得更准确的估计。

使用更大的段长度可以区分频率分量。当信号分量彼此靠近时,这很有用。

使用 Matplotlib

Matplotlib 还包含一种计算和显示 PSD 的方法。它使用前面讨论的 Welch 方法计算 PSD。

结果与 Scipy 的 Welch 方法相当。如果您想避免 Scipy 的依赖,Matplotlib 可能很有用。

朴素的 Python 实现

我们可以编写一个简单的 Python 实现,它只需要 numpy。这个实现完全遵循定义。它的速度非常慢。不过,如果您只需要计算几个频率的 PSD,它可能会很有用。

代码

然后,为了计算频率的 PSD,我们可以直接使用以下方法;

代码

结论

现在您已经掌握了计算 PSD 和周期图的基本工具。使用传统的信号处理包非常容易。您还应该对如何严格按照数学定义来实现 PSD 方法有大致了解。


下一个主题PltPcolor Python