Wyodrębnij dane szybkiej transformacji Fouriera z pliku

Buduję narzędzie, które ma działać na serwerze i analizować pliki dźwiękowe. Chcę to zrobić w Ruby, ponieważ wszystkie moje inne narzędzia są również napisane w Ruby. Ale mam problem ze znalezieniem dobrego sposobu osiągnięcia tego.

Wiele przykładów, które znalazłem, to wizualizatory i elementy graficzne. Potrzebuję tylko danych FFT, nic więcej. Muszę zarówno pobrać dane audio, jak i wykonać na nich FFT. Moim celem końcowym jest obliczenie pewnych rzeczy, takich jak średnia / mediana / tryb, 25-percentyl i 75-percentyl na wszystkich częstotliwościach (ważona amplituda), BPM i być może inne dobre cechy, które później będą w stanie połączyć podobne dźwięki razem .

Najpierw próbowałem użyćruby-audio ifftw3 ale nigdy nie idę na dwójkę, żeby naprawdę współpracować. Dokumentacja też nie była dobra, więc naprawdę nie wiedziałem, jakie dane są przetasowywane. Następnie próbowałem użyćbplay / brec i ogranicz mój skrypt Ruby, aby używał STDIN i wykonał FFT (nadal używając fftw3). Ale nie mogłem uruchomić bplay / brec, ponieważ serwer nie ma karty dźwiękowej i nie udało mi się po prostu przekazać dźwięku bezpośrednio do STDOUT bez przechodzenia najpierw do urządzenia audio.

Oto najbliższy, jaki dostałem:

# extracting audio from wav with ruby-audio
buf = RubyAudio::Buffer.float(1024)
RubyAudio::Sound.open(fname) do |snd|
    while snd.read(buf) != 0
        # ???
    end
end

# performing FFT on audio
def get_fft(input, window_size)
    data = input.read(window_size).unpack("s*")
    na = NArray.to_na(data)
    fft = FFTW3.fft(na).to_a[0, window_size/2]
    return fft
end

Więc teraz utknąłem i nie mogę znaleźć więcej dobrych wyników w Google. Więc może wy, chłopaki, możecie mi pomóc?

Dzięki!

questionAnswers(2)

yourAnswerToTheQuestion