理解频谱图和n_mels的形状

6
我正在阅读这两篇Librosa文档:melspectrogramstft
我正在处理长度可变的音频数据集,但是我不太理解它们的形状。例如:
(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. 窗口长度指的是用于计算音频该段时间内FFT的长度。
  3. STFT是在音频的小时间窗口中进行FFT计算。
  4. 输出的形状为(n_mels, t),其中t = 音频持续时间/FFT窗口。

我想理解或计算以下内容:

  1. n_fft是什么?我想知道它对音频波形做了什么。我在文档中读到以下内容:

    n_fft : int > 0 [scalar]

    用零填充后的窗口信号长度。STFT矩阵D的行数为(1 + n_fft/2)。默认值n_fft=2048表示在22050 Hz的采样率下, 2048个样本对应物理持续时间为93毫秒。


    这意味着每个窗口取2048个样本,也就是说 --> 1/22050 * 2048 = 93[ms]。FFT是针对每93[ms]的音频计算的吗?


    这是否意味着窗口大小和窗口用于在这个帧中过滤信号?


  2. 在上面的示例中,我理解为我得到了128个梅尔频谱图,但具体指什么呢?

  3. 什么是hop_length?根据文档,我了解到它是如何将窗口从一个FFT窗口移动到另一个窗口的,对吗?如果该值为512并且n_fft也为512,那么这是什么意思?这是否意味着它会取23[ms]的窗口,计算此窗口的FFT并跳过下一个23[ms]的窗口?

  4. 如何指定我希望从一个FFT窗口重叠到另一个窗口?


请帮帮我,我看了很多计算频谱图的视频,但似乎无法在实际生活中看到它。


https://dev59.com/LLvoa4cB1Zd3GeqP_Nbq#62592111的回答是否已经充分解答了您的问题? - Hendrik
1个回答

12
理解频谱图输出维度的关键参数并不一定是所使用的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频谱)。


你好,我刚刚在这里发布了一个关于Mel频带的问题:https://stackoverflow.com/questions/62623975/why-128-mel-bands-are-used-in-mel-spectrograms你能帮忙解答一下吗? 谢谢 :) - swe87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接