我的 librosa MFCC 输出是否正确?我想我在使用 librosa MFCC 时得到了错误的帧数

问题描述

result=librosa.feature.mfcc(signal,16000,n_mfcc=13,n_fft=2048,hop_length=400)
result.shape()

信号长 1 秒,采样率为 16000,我计算了 13 MFCC,跳长为 400。输出维度为 (13,41)。为什么我得到 41 帧,不是应该是 (time*sr/hop_length)=40 吗?

解决方法

您使用时间序列作为输入 (signal),这意味着 librosa 首先使用 melspectrogram 函数计算梅尔频谱图。它需要一堆参数,您已经指定了其中一个 (n_fft)。需要注意的是,melspectrogram 还提供了两个参数 centerpad_mode,分别具有默认值 True"reflect"

来自文档:

pad_mode:字符串: 如果 center=True,则在信号边缘使用的填充模式。 默认情况下,STFT 使用反射填充。

中心:布尔值: 如果为 True,则填充信号 y,以便帧 t 以 y[t * hop_length] 为中心。 如果为 False,则帧 t 从 y[t * hop_length]

开始

换句话说,默认情况下,librosa 使您的信号更长(垫)以支持居中。

如果您想避免这种行为,您应该将 center=False 传递给您的 mfcc 调用。

说了这么多,请记住,如果 n_fft 长度为 2048 并且跳长度为 400,您不一定会得到 (time*sr/hop_length)=40 帧,因为您还必须考虑 window 而不仅仅是 hop 长度(除非你以某种方式填充)。跳跃长度仅由您移动该窗口的样本数指定。