Расчет спектрального центроида с использованием либроса - PullRequest
0 голосов
/ 03 марта 2020

Я нашел следующие два способа вычисления спектрального центроида, но они не возвращают одно и то же значение.

Какая версия верна и чем эти 2 отличаются друг от друга?

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))

1 Ответ

0 голосов
/ 04 марта 2020

Ну, оба должны быть правильными, если вы следовали правильным формулам. Я бы хотел go с реализацией librosa , потому что я доверяю команде разработчиков. Очевидно, вы также можете использовать свой подход, если он обеспечивает преимущество в вашем случае использования.

Теперь давайте рассмотрим почему результаты отличаются? Это связано с тем, что ваш подход использует Дискретное преобразование Фурье (ДПФ) , реализованное в numpy .fft.rfft , где в качестве подхода librosa.feature.spectral_centroid используется кратковременное преобразование Фурье (STFT) . Вы можете проверить это, взглянув на следующие ссылки librosa: спектрально-центроид & спектр .

STFT и DFT дают разные преимущества, так что, поскольку STFT зависит от времени и информация о временных изменениях не будет потеряна, она вычислительно более интенсивна и медленнее, чем DFT.

...