我正在尝试使用Librosa分析短音频文件,尤其是频谱质心函数。但是,此函数在音频文件内的不同帧处输出代表频谱质心的不同值的数组。该文档说,可以n_fft
在调用函数时通过指定参数来更改帧大小。如果此功能一次分析整个音频文件,而不是在多个时间点输出结果,那对我来说将更加有益。有没有一种方法可以让我指定要使用整个音频文件的帧大小而不是默认时间(即2048个样本)来调用函数?还有另一种更好的方法吗?
干杯,谢谢!
FFT窗口(n_fft
)的长度不仅指定了您需要多少个样本,还指定了结果的频率分辨率(更长n_fft
,更好的分辨率)。为了确保许多文件具有可比的结果,您可能希望n_fft
对所有文件使用相同的值。
这样一来,说您的文件全部不超过16k个样本。然后,您仍然可以实现合理的运行时间(FFT在O(N log N)中运行)。显然,随着文件大小的增加,这种情况会变得更糟。因此您可以调用spectral_centroid(y=y, n_fft=16384, hop_length=16384, center=False)
和,因为hop_length
设置为与n_fft
计算非重叠窗口的FFT相同的值。并且由于n_fft
大于所有文件中的最大样本数(在此示例中),因此您应该仅获得一个值。请注意,我设置center
为False
避免进行您的方案不需要的调整。
除了选择一个长的变换窗口之外,您还可以使用STFT计算重叠窗口(或帧)的许多值(这是librosa所做的事情),并像这样简单地对所得值求平均:
import numpy as np
import librosa
y, sr = librosa.load(librosa.ex('trumpet'))
cent = librosa.feature.spectral_centroid(y=y, sr=sr, center=False)
avg_cent = np.mean(cent)
print(avg_cent)
2618.004809523263
后一种解决方案与MIR和我的建议中通常所做的一致。请注意,这还允许您使用其他统计功能,例如中位数,可能是您感兴趣的东西,也可能不是您感兴趣的东西。换句话说,您可以确定质心的分布,这些质心可能具有更多含义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句