【问题标题】:Spectral Centroid Calculation using librosa使用 librosa 计算光谱质心
【发布时间】:2020-03-03 14:06:53
【问题描述】:

我找到了以下两种计算光谱质心的方法,但它们返回的值不同。

哪个是正确的版本,两者有何不同?

1.

def spectral_centroid(x, samplerate=44100):
    magnitudes = np.abs(np.fft.rfft(x)) # magnitudes of positive frequencies
    length = len(x)
    freqs = np.abs(np.fft.fftfreq(length, 1.0/samplerate)[:length//2+1]) # positive frequencies
    return np.sum(magnitudes*freqs) / np.sum(magnitudes)

2.

cent = librosa.feature.spectral_centroid(y=y, sr=sr)
print(np.mean(cent.T, axis=0))

【问题讨论】:

    标签: python signal-processing librosa


    【解决方案1】:

    如果您遵循正确的公式,那么两者都应该是正确的。不过我会选择librosa 实现,因为我相信它背后的开发团队。显然,如果它在您的用例中提供优势,您也可以使用您的方法。

    现在让我们解决为什么结果不同?这是因为您的方法使用在numpy.fft.rfft 中实现的Discrete Fourier Transform (DFT),而librosa.feature.spectral_centroid 方法使用@987654325 @。您可以通过查看以下 librosa 链接来验证这一点:spectral-centroidspectrum

    STFT 和 DFT 具有不同的优势,因此由于 STFT 是时间相关的,并且不会丢失时间变化的信息,因此它比 DFT 计算量更大且速度更慢。

    【讨论】:

    • 感谢您的回复。我的理解是,librosa 会将信号分成更短的 bin,并计算每个窗口的质心,并将结果显示为数组。如果这是正确的,那么在整个时间范围内,取平均值是计算质心的最佳方法吗?
    • 我会说是的,在给定同样长的帧(就是这种情况)的情况下,平均值应该是确定一般光谱质心的好方法。
    猜你喜欢
    • 2014-09-09
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多