Scipy.signal.spectrogram 输出长度

Scipy.signal.spectrogram output lengths

我正在尝试分析数组中特定时间点的歌曲频率。

我正在使用 scipy.signal.spectrogram 函数生成这些频率。歌曲长度2:44,即164秒,scipy.wavfile读取的采样率为44100.

当我使用频谱图时:

f, t, Sxx= signal.spectrogram(data[:, 1], sr)

f的长度真小,129个元素。 t 更长,为 32322,但与原始 wavfile.read.

中的 7240320 采样 windows 相差甚远

(data[:, 1]是音频数据的右声道)

f的长度默认nperseg stft 256除以2(只在频率刻度的正侧)+1(频率0)。 时间样本数通过

实现
t.size = len(data[:, 1]) / nperseg * (1 + noverlap) 

其中 noverlap256/8=32

频率数组f以采样频率的一半加上零频率为限,所以

f.size = int(1 + sampling_frequency / 2)

而时间数组受限于您可以基于 nperseg 和 noverlap 从数据数组中提取的段数,就像这样

t.size = int(len(data[:, 1]) - noverlap) / (nperseg - noverlap))

如果您想象要有两个 nperseg=8 和 noverlap=1 的段,您至少需要一个包含 15 个样本的信号,就更容易理解这一点。