这个算法得到的频谱图是一维的还是二维的?

信息处理 频谱图 stft
2022-02-01 07:09:45

我正在实现一个频谱图算法并且我得到了基本概念,但是,我正在努力解决一些问题。

假设我有一个一维向量:

data = [0.36, 0.58, ...., 0.25]

然后我计算这个数据的 STFT(重叠 128 个),然后生成一个二维数组。然后我计算这些值的对数以计算频谱图。结果向量是一维的还是二维的?由于 STFT 是 2D 的(因为它被分成块),我猜测频谱图将是 1D 表示,因为我正在计算日志。

3个回答

频谱图是二维的,通常从一维输入向量计算。

例如,您想要一个具有频域跨度的 k-pts 和时域跨度的 M-pts 的频谱图。在没有重叠的情况下,长度为 N = kx M 的输入向量将填充频谱图。每 k 个样本执行一次 k-pt DFT,并在频谱图上生成 M 个时间轴向量之一。

对于重叠为 k/2 的运行频谱图,则需要 N/2 个输入样本来创建 akx M 频谱图,并且时间尺度将减半。

通常,对数仅用于缩放 DFT 输出的幅度。即,DFT 输出中的 k 个复样本中的每一个都成为从复样本幅度的对数计算的标量值。

2D 矩阵的每个元素的对数仍然是 2D 矩阵(通常是频谱图的时间与频率)。采用 log() 通常是为了使图形输出比线性可视化更接近人类的感知反应。

在频谱图中,您将 1D 数据向量(时间序列)拆分为具有一些重叠的几个段。该段的傅立叶变换仍然会为您生成一个带有频率轴的一维向量。但是,您对所有段执行 STFT,这也将为您提供时间轴。通过对齐每个段的 STFT,您可以形成一个二维数组(时间 * 频率)。IfPx = spectrogram(...); plot(abs(Px))给你一堆曲线,每条曲线作为 . 列的 y 轴值Px换句话说,该函数绘制每个段的 STFT 曲线。更常用的是imagesc(abs(Px))它向您显示幅度图像,每个像素代表特定的时间和频率。