Python - 如何从频谱图输出中获得相同数量的行?

Posted

技术标签:

【中文标题】Python - 如何从频谱图输出中获得相同数量的行?【英文标题】:Python - how to get the same number of rows from a spectrogram output? 【发布时间】:2017-12-16 22:12:37 【问题描述】:

假设我有一个七列的数据集,我只取一列 (xyz_magnitude) 大小为 1,415,684 行,然后输入它来计算该列的频谱图,我希望得到一列大小相同的频谱图作为输入(xyz_magnitude),但它让我得到超过 1,415,684 的一列。它实际上打印了 7,087,647 行

为什么频谱图的行数如此之多,以及为什么它与输入的行数不同

这是我的代码

dataset = np.loadtxt("dataset.txt", delimiter=",")
magnitude = dataset[:,5]
ls, freqs, bins, im = plt.specgram(magnitude, NFFT=1000, Fs=1.0, noverlap=900)
merged = list(itertools.chain(*ls))

【问题讨论】:

【参考方案1】:

specgram 计算输入信号的多个段的离散傅立叶变换,以给出一个输出矩阵,该矩阵表示随时间变化的频率内容(沿每个给定列的行)(每列代表不同的时刻)。

在您的特定情况下,将参数 NFFT 设置为 1000 时,您将获得带有 1000/2 + 1 或 501 行的输出(即包括 501 个频率区间)。时间片的数量由NFFTnoverlap 参数的组合控制,以提供14,147 行。这会产生 501 * 14,147 = 7,087,647 值(与您的串联输出一致)。

要获得单个时间片(与NFFT=1000 一样具有更多的频率箱),您可以设置NFFT=1,415,684(这将为您提供sides=default/sides=onesided 的707,843 个值的输出,或者1,415,684 个值,sides=twosided) 和 plt.specgram,或使用 FFT 原语,例如 numpy.fft

【讨论】:

以上是关于Python - 如何从频谱图输出中获得相同数量的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在频谱图Python中找到峰值[重复]

如何使用 python 获得像 audacity 这样的音频频谱?

你能告诉我如何从声音中检测事件,无论其波或频谱的一部分是不是超过特定数量的阈值? [复制]

如何将波形数据转换为复数

使用 CNN 将固定长度的频谱图嵌入到张量的方法

如何在javascript中为每个频谱栏添加类?