问题描述
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 还提供了两个参数 center
和 pad_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 长度(除非你以某种方式填充)。跳跃长度仅由您移动该窗口的样本数指定。