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!