了解频谱图的形状和 n_mels

Understanding the shape of spectrograms and n_mels

我正在浏览这两个 librosa 文档:melspectrogram and stft

我正在研究可变长度的音频数据集,但我不太了解其形状。例如:

(waveform, sample_rate) = librosa.load('audio_file')
spectrogram = librosa.feature.melspectrogram(y=waveform, sr=sample_rate)
dur = librosa.get_duration(waveform)
spectrogram = torch.from_numpy(spectrogram)
print(spectrogram.shape)
print(sample_rate)
print(dur)

输出:

torch.Size([128, 150])
22050
3.48

我得到的有以下几点:

  1. 采样率是指每秒获取 N 个样本,在本例中为每秒 22050 个样本。
  2. window 长度是针对这段音频长度计算的 FFT。
  3. STFT是计算osFFT在小windows音频的时间。
  4. 输出的形状是(n_mels, t)。 t = duration/window_of_fft.

我正在尝试理解或计算:

  1. 什么是n_fft?我的意思是它对音频波到底做了什么?我在文档中阅读了以下内容:

    n_fft : int > 0 [scalar]

    length of the windowed signal after padding with zeros. The number of rows in the STFT matrix D is (1 + n_fft/2). The default value, n_fft=2048 samples, corresponds to a physical duration of 93 milliseconds at a sample rate of 22050 Hz, i.e. the default sample rate in librosa.


    这意味着在每个 window 中采集了 2048 个样本,这意味着 --> 1/22050 * 2048 = 93[ms]。正在为每 93[ms] 的音频计算 FFT?


    所以,这意味着 window 大小和 window 是用于过滤此帧中的信号?


  2. 在上面的示例中,我知道我得到了 128 个 Mel 频谱图,但这到底是什么意思?

  3. 什么是hop_length?阅读文档,我了解到如何将 window 从一个 fft window 转移到下一个?如果这个值是 512 而 n_fft = 也是 512,那是什么意思?这是否意味着它将花费 23[ms] 的 window,为此 window 计算 FFT 并跳过下一个 23[ms]?

  4. 如何指定我想要从一个 FFT window 重叠到另一个?


请帮忙,我看过很多计算频谱图的视频os,但我在现实生活中似乎看不到它。

理解频谱图输出维度的基本参数不一定是所用 FFT 的长度 (n_fft),而是连续 FFT 之间的距离,即 hop_length.

在计算 STFT 时,您计算多个短段的 FFT。这些段的长度为 n_fft。通常这些段重叠(为了避免信息丢失),所以两个段之间的距离通常不是 n_fft,而是 n_fft/2。此距离的名称是 hop_length。样本中也有定义。

所以当你有 1000 个音频样本时,hop_length 是 100,你得到 10 个特征帧(注意,如果 n_fft 大于 hop_length,你可能需要垫)。

在您的示例中,您使用的是默认值 hop_length 512。因此对于以 22050 Hz 采样的音频,您获得的特征帧速率为

frame_rate = sample_rate/hop_length = 22050 Hz/512 = 43 Hz

同样,填充可能会稍微改变这一点。

因此,对于 22050 Hz 的 10 秒音频,您会得到一个维度为 (128, 430) 的频谱图数组,其中 128 是 Mel bin 的数量,430 是特征的数量(在本例中为 Mel 频谱) .