Python: .wav文件的谱质心?

3 投票
2 回答
6119 浏览
提问于 2025-04-18 10:42

我需要定义一个“谱心”函数,用来分析音频文件,但我不知道怎么把数学公式转成代码。如果有人能帮我,那就太好了,我已经没有主意了。

这里提到的公式是:

http://en.wikipedia.org/wiki/Spectral_centroid

我已经能够通过以下方式计算信号的谱平坦度:

def spectral_flatness(x): 
    X_f = fft(x) 
    N = len(X_f) 
    magnitude = abs(X_f[:N/2]) 
    sf = geom_mean(magnitude) / aritm_mean(magnitude) 
    return sf

这是我把数学公式转成代码的一个例子。我对这些东西还很陌生,所以稍微一个小动作对我来说都可能很有挑战性。我找到了一些关于几何中心的信息,但没有关于谱中心的资料……

2 个回答

0

另一种可能性是使用librosa的spectral_centroid方法。这个方法可以帮助我们提取音频特征,librosa里有很多有用的音频特征提取方法。你可以查看这个链接了解更多关于谱心(Spectral Centroid)的信息。

5

我以前从来没有实现过这个,但根据我对维基百科公式的理解,它应该是这样的:

import numpy as np

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) # return weighted mean

撰写回答