首页 > 解决方案 > 了解频谱图和 n_mels 的形状

问题描述

我正在浏览这两个 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 = 持续时间/window_of_fft。

我试图理解或计算:

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

    n_fft : int > 0 [标量]

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


    这意味着在每个窗口中采集 2048 个样本,这意味着 --> 1/22050 * 2048 = 93[ms]。每隔 93 [ms] 的音频计算一次 FFT?


    那么,这是否意味着窗口大小和窗口是为了过滤这一帧中的信号?


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

  3. 什么是hop_length?阅读文档,我知道这是如何将窗口从一个 fft 窗口移动到下一个窗口?如果这个值是 512 并且 n_fft = 也是 512,那是什么意思?这是否意味着它将占用 23[ms] 的窗口,计算此窗口的 F​​FT 并跳过接下来的 23[ms]?

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


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

标签: pythonaudiolibrosaaudio-processingspectrogram

解决方案


理解频谱图输出维度的基本参数不一定是使用的 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_length512。因此,对于以 22050 Hz 采样的音频,您获得的特征帧速率为

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

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

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


推荐阅读