python - 了解频谱图和 n_mels 的形状
问题描述
我正在浏览这两个 librosa 文档:melspectrogram
和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
我得到的是以下几点:
- 采样率是您每秒获得 N 个样本,在这种情况下每秒 22050 个样本。
- 窗口长度是为该音频长度周期计算的 FFT。
- STFT 是音频时间小窗口中的 FFT 计算。
- 输出的形状是 (n_mels, t)。t = 持续时间/window_of_fft。
我试图理解或计算:
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?
那么,这是否意味着窗口大小和窗口是为了过滤这一帧中的信号?
在上面的例子中,我知道我得到了 128 个梅尔谱图,但这到底是什么意思?
什么是hop_length?阅读文档,我知道这是如何将窗口从一个 fft 窗口移动到下一个窗口?如果这个值是 512 并且 n_fft = 也是 512,那是什么意思?这是否意味着它将占用 23[ms] 的窗口,计算此窗口的 FFT 并跳过接下来的 23[ms]?
如何指定我想从一个 FFT 窗口重叠到另一个?
请帮忙,我看过很多计算频谱图的视频,但我似乎在现实生活中看不到它。
解决方案
理解频谱图输出维度的基本参数不一定是使用的 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 频谱)。
推荐阅读
- c - c - 链表中的指针问题
- google-bigquery - 连接谓词中的表不受支持的子查询
- mysql - 计数最多捐赠者 SQL
- node.js - 为什么我在 Express 上设置 CORS 时出现飞行前错误?
- angular - Angular 7/Ionic 4 - 背景图像 url 路径问题
- angular - 离子无法连接到服务器
- spectral-density - 转换功率谱密度的维度
- html - 将 100vh 高度页面中的元素向上滚动并移出视图
- artifactory - 是否可以自动设置 Artifactory 属性?
- spring-boot - 在 SpringBoot 中使用 Jaeger 将请求标头转发到下一个微服务