спектральный центр тяжести массива - PullRequest
0 голосов
/ 04 января 2019

У меня есть файл .wav (в этом примере он называется "piano2.wav").

Я хочу найти спектральный центр тяжести в Python.

используя кодиз другого поста здесь у меня есть эта функция:

import numpy as np
from scipy.io.wavfile import read

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

Я читаю файл WAV, используя scipy.io.wavfile.read в массив Numpy, а затем пытаюсь передать его в вышеуказанную функцию

a=read("piano2.wav")
print("Spectral centroid is " + spectral_centroid(a[1]))

Это ошибка, которую я получаю

  File "test.py", line 20, in <module>
    print("Spectral centroid is " + spectral_centroid(a[1]))
  File "test.py", line 8, in spectral_centroid
    return np.sum(magnitudes*freqs) / np.sum(magnitudes) 
ValueError: operands could not be broadcast together with shapes (302712,2) (151357,)

1 Ответ

0 голосов
/ 04 января 2019

Вы пытаетесь умножить массивы разных форм (magnitudes и freqs):

a = np.arange(10)
b = np.arange(5)
print(a*b)

ValueError: операнды не могут быть переданы вместе с фигурами (10,) (5,)

Это может помочь:

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