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)
其中 noverlap
是 256/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 个样本的信号,就更容易理解这一点。
我正在尝试分析数组中特定时间点的歌曲频率。
我正在使用 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)
其中 noverlap
是 256/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 个样本的信号,就更容易理解这一点。