在 .wav 文件的 window 上计算功率谱图

Calculating power-spectrogram on a window of a .wav file

我正在尝试计算一部分声音文件的功率谱图。 目前我正在为此使用 librosa

我正在通过 20*1e-3*samplerate 计算我的 windowsize。 我想知道的是结果(特别是 t 的长度),如下例所示:

44.1kHz 的采样率与 20ms 的时间帧相结合产生 window 882 个样本。

In [2]: D = np.abs(librosa.stft(y[:882]))**2

In [3]: np.shape(D)
Out[4]: (1025, 2)

我得到的结果是 2 毫秒的时间范围,这不是我的预期。有人可以帮助我/指出我做错了什么吗?

默认情况下 librosa.stft 使用 2048 的 FFT 大小 n_fft 并且输出的第一维匹配实际输入信号的非冗余频率分量的数量(1+n_fft/2, 在本例中为 1025).

第二个维度由时间片的数量决定,我想这就是您有点困惑的地方,期待您的 882 个样本中有一个时间片。但是 librosa.stft 计算 重叠 时间片的输出。用于每个切片的样本数默认设置为 win_length / 4,由于您没有指定 win_length,因此设置为 n_fft / 4 或 512。充分利用您的882 个样本(并根据需要进行填充),这为您提供了两个切片:

  • 一个用于样本 0 到 2047;
  • 样本 512 到 881 的另一个,并添加了零填充。

如果您不希望任何重叠,您可以设置 hop_length 参数以匹配 n_fft.