SciPy 频谱图

2025 年 2 月 25 日 | 阅读 8 分钟

频谱图简介

在现代数据科学中,许多类型的数据都需要进行分析,而不同的分析方法使我们能够更好地检查或理解数据。尽管如此,在处理随时间变化的时间序列数据时,频谱图是最广泛使用的分析工具。这类数据最常见的类型是声波、电磁波和音频文件;所有这些都以数据的形式提供信号信息。因此,频谱图的主要目的是确定信号的频率和幅度。

频谱图在 x 轴上绘制时间,y 轴上绘制频率,z 轴上绘制幅度以获取更具体的信息,用于将信号可视化为图像。此外,它还可以使用不同的颜色,其中信号强度可以通过颜色密度来确定。最后,它为您提供了信号的摘要,解释了信号如何在不同频率之间分配其强度。

因此,任何频谱图的两个主要要素是信号的频率和幅度。为了避免混淆我们稍后将在文章中使用的术语,我们将稍后提供每个术语的一般定义。

频率

在数学中,频率被定义为在一个单位时间内穿过给定点的波的数量,或者在一个单位时间内完成周期性运动的物体完成的周期的数量。

振幅

振幅是运动物体在周期性运动期间在一个单位时间内可以达到的最大距离,或者当波在平坦表面上方或下方波动时可以达到的最大距离。

我们可以在下图可视化这些组件。

SciPy Spectrogram

接下来,让我们讨论频谱图。

频谱图的数学基础是 Gabor 变换。频谱图使用 Gabor 变换计算。Gabor 变换(短时傅里叶变换的一个特例)可以在特定部分提取信号的正弦频率和相位内容。我们取时间或空间中的某些信号,并使用傅里叶变换将其写入其频率分量。正式地说,通过执行傅里叶变换,我们可以从任何信号中提取构成信号的频率分量。傅里叶变换后的信号和频率图显示在下面的图片中。

傅里叶变换后可以看到频率分量,但为了说明目的,我们假设图中的信号是任何歌曲的音频信号。时间域图让我们知道正在播放的单词或音乐。我们可以通过查看频域图来确定曲调的频率。Gabor 变换用于解决在给定时间不知道频率的问题。

Gabor 变换

通过使用时频图来跟踪信号中的具体信息,例如随时间变化的频率,Gabor 变换使我们能够确定任何信号的频谱图。Gabor 变换将高斯函数乘以我们的信号函数。该函数可以被认为是窗口函数。然后通过将傅里叶变换应用于过程的结果来获得时频分析。

我们希望分析并给予更多权重的时刻附近的信号被称为窗口函数。Gabor 变换可以数学上表示为:

SciPy Spectrogram

该图说明了傅里叶变换如何成为 Gabor 变换的基础。如前所述,我们可以看到 Gabor 变换是通过将函数的傅里叶变换与频率的窗口函数相乘得到的。窗口函数将随时间滑动,因此本质上,它是时间范围的函数,或者换句话说,完成一个信号频率所需的时间量。

我们可以可视化,我们在下面的图像中取了一个高斯窗口,它在信号上移动。当它定位在该时间域时,它将赋予该特定时刻的信号权重。因此,关键将显示为我们信号的时频图上的小点。而距离 y 轴的距离表示时间,距离 x 轴的距离表示频率幅度。

之后,我们将研究如何在 Python 中创建频谱图并检查任何信号图中的信息。可以使用多种方法在 Python 中创建任何频谱图,并且许多库都提供直接的模块来创建任何信号的频谱图。让我们看看我们是否可以做到。

理解 scipy.signal.spectrogram() 方法

SciPy 库的 signal 模块提供了一个名为 spectrogram() 的方法,该方法允许我们在 Python 中创建频谱图。scipy.signal.spectrogram() 方法的语法如下:

语法

参数

  1. x: array_like
    测量值的时间序列
  2. fs: float, optional
    x 时间序列的采样频率。默认为 1.0。
  3. window: str 或 tuple 或 array_like, optional
    窗口类型由输入的字符串或元组确定,然后将其传递给 get_window 以生成 DFT 偶值。如果窗口是 array_like,则直接使用它,其长度必须为 nperseg。默认值为形状参数为 0.25 的 Tukey 窗口。
  4. nperseg: int, optional
    每个段的长度。默认为 None,但如果窗口是字符串或元组,则设置为 256,如果窗口是 array_like,则设置为窗口的长度。
  5. noverlap: int, optional
    段之间重叠的点数。如果为 None,则 noverlap = nperseg // 8。默认为 None。
  6. nfft: int, optional
    如果需要零填充 FFT,则用于 FFT 的长度。如果为 None,则 FFT 长度为 nperseg。默认为 None。
  7. detrend: str 或 function 或 False, optional
    detrend 函数指定了对每个段进行去趋势的方法,可以是字符串或函数。如果 detrend 为 False,则不执行去趋势,默认值为 'constant'。
  8. return_onesided: bool, optional
    如果为 True,则返回实数据的单边频谱。如果为 False,则返回双边频谱。默认为 True,但对于复数数据,始终返回双边频谱。
  9. scaling: { ‘density’, ‘spectrum’ }, optional
    该函数在计算功率谱密度(单位为 V**2/Hz)和功率谱(单位为 V**2)之间进行选择,默认为 'density'。
  10. axis: int, optional
    计算频谱图的轴;默认值为最后一个轴(即 axis=-1)。
  11. mode: str, optional
    文本概述了 STFT 输出的预期返回值,包括“complex”、“magnitude”、“angle”和“phase”,它们分别表示 STFT 的绝对幅度、角度和相位。

返回值

  1. f: ndarray
    样本频率数组。
  2. t: ndarray
    段时间数组。
  3. Sxx: ndarray
    x 的频谱图。默认情况下,Sxx 的最后一个轴对应于段时间。

现在让我们讨论各种示例,说明在 Python 中实现频谱图。

Python 中的频谱图实现

在下一节中,我们将学习如何使用 Python 中的 scipy.signal.spectrogram() 方法,以便通过各种示例创建频谱图。

示例 1

输出

SciPy Spectrogram

输出

SciPy Spectrogram

示例 2

输出

SciPy Spectrogram

频谱图的一些实际应用

由于频谱图显示了信号的频率如何在时间上分布,因此它们被广泛应用于许多不同的领域。它们提供了信号在一段时间内的频谱内容信息,这在无线通信、地震学以及音乐和语音处理等各个领域都非常有帮助。

1. 语音和音乐处理

由于它们可以根据频率内容及其随时间的变化来区分不同的音符和音素,因此频谱图在语音和音乐分析中非常有用。例如,分光光度图可用于检测音乐中的节奏和速度,或可视化作品的和声结构。例如,分光光度图可用于检测音乐中的节奏和速度,或可视化作品的和声结构。在语音处理中,它们被用于在语音识别系统中识别不同的语音特征。此外,频谱图还有助于在语音信号处理中诊断特定的声音问题。

2. 地震学

在地震学中,分光光度图用于检查由火山爆发或地震引起的地震波。可以从这些波随时间变化的独特频率内容中获得有关底层地质过程的重要细节。通过分析这些波的频谱图,地震学家可以更多地了解火山内部的岩浆循环或地震的震源机制。

3. 无线通信

在无线和无线电通信中,分光光度图用于分析传输信号的频率内容。这对于频谱管理(确保不同的通信系统不会相互干扰)或检测信号干扰可能尤其重要。此外,它们还用于认知无线电系统,以动态检测未占用的频段。

4. 生物声学

生物声学领域的研究人员使用分光光度图来分析动物的声音。例如,蝙蝠回声定位信号、海豚声音或鸟鸣的研究。动物行为、物种识别和种群估计都得益于这种方法。

5. 法医音频

在音频法证学中,频谱图用于检查音频录音。频率内容可以帮助检测音频篡改的实例,或提供有关录音环境和设备的信息。