Czy istnieje program, który może określić najwyższą wysokość w pliku audio?


14

Czy istnieje program Windows, który może określić „najwyższą częstotliwość fali dźwiękowej” znalezioną w pliku audio (np. Pliku mp3)?

Na przykład powinna być w stanie przeanalizować plik Dog-Whistle-0 i ustalić, że najwyższa częstotliwość znaleziona w pliku wynosi około ~ 12000 Hz.

Ponadto powinien być w stanie przeanalizować Piano.mp3 i ustalić najwyższą nutę.

Odpowiedzi:


13

R jest wieloplatformowy i darmowy / open source.

Załaduj i załaduj biblioteki tuneRoraz seewave(zainstaluj je z menedżera pakietów, jeśli jeszcze nie zostały zainstalowane).

library(tuneR)
library(seewave)

Następnie załaduj plik MP3 lub WAV:

w = readMP3("dog-whistle-0.mp3")
w = readWave("dog-whistle-0.wav")

Teraz wykreślmy spektrum i jego szczyty:

fpeaks(meanspec(w), nmax=1)

Wynik:

Wynik liczbowy:

fpeaks(meanspec(w), nmax=1, plot=FALSE)
12.05859

Powyższe działa tylko z danymi niemuzycznymi. Kiedy analizujesz częstotliwości muzyki, zauważysz, że najwyższe częstotliwości zawsze będą wynosić około 12-20 kHz, w zależności od instrumentu (instrumentów). Jednak ta najwyższa częstotliwość nie da oszacowania granej nuty, ponieważ nuta muzyczna, grana przez instrument, będzie się składać z wielu częstotliwości.

Jest to tak zwana „barwa” instrumentu, a przekonasz się, że A przy 440 Hz przez flet będzie zawierał różne składowe częstotliwości w porównaniu do A granego na gitarze elektrycznej.

Najlepiej jest przeprowadzić dominującą analizę częstotliwości, patrząc na szczyty częstotliwości w przesuwanych oknach czasowych i sprawdzić, gdzie występuje najwyższa.

Nie ma jednak czegoś takiego jak „częstotliwość w czasie”. Można jedynie wykreślić średnią (lub częstotliwość) dominującą nad pewnymi przesuwnymi czasowych okien . Seewave oferuje całkiem sporo funkcji związanych z wybieraniem przedziałów czasu, ale komplikuje się.

Możesz użyć

s = specprop(meanspec(w, from=10, to=11)) 

aby uzyskać właściwości widma od 10 do 11 sekund, a następnie wywołać s$centroidlub s$meanuzyskać centroid lub średnie częstotliwości dla tego konkretnego okna czasowego (chociaż 1 sekunda jest dość duża dla analizy audio).

Jeśli plik Wave korzysta z próbkowania 44,1 kHz, możesz zmniejszyć jego próbkę w celu zmniejszenia wysiłku obliczeniowego, np. Do 16 kHz.

w = downsample(w, 16000)

Pamiętaj jednak, że zgodnie z twierdzeniem Nyquista maksymalna częstotliwość, którą można teraz przedstawić, wynosi 8 kHz.

Możesz także poszukać oprogramowania do wykrywania wysokości dźwięku. Jak ten , który wymaga jednak MATLAB.


Btw zamiast tego fpeaks, czy wiesz, czy istnieje funkcja, która wykreśla wykres częstotliwości w funkcji czasu?
Pacerier

Zobacz moją aktualizację. To nie jest takie trywialne. Przepraszam, ale nie pracowałem już z dźwiękiem, żeby wiedzieć, czy jest coś lepszego.
slhck

8

Czy próbowałeś Audacity ? Jest to darmowe narzędzie, które ma pewne dość zaawansowanych narzędzi analitycznych, w tym działki Spectrum polecenia dostępne z Analyse -> Plot Spectrum ... .

Zrzut ekranu

Zauważ, że otrzymujesz inne wyniki w wersji MP3 pliku niż w wersji WAV, ponieważ kompresja MP3 zmieniła przebieg i wprowadziła artefakty / aliasing.

Edycja: pliki dźwiękowe, do których linkujesz, nie są tego dobrym przykładem. Pliki o wyższej częstotliwości są próbkowane tylko z częstotliwością 44,1 KHz, która jest dostosowana do ludzkiego słuchu (maks. Około 20 KHz). Nie można przedstawić częstotliwości ultradźwięków bez zwiększenia częstotliwości próbkowania.


Hmm, wygląda na to, że nie działa z plikiem Piano.mp3 . Dla mnie pokazuje 10121 Hz (D # 9) screenhoot.me/uZZ2N0 , ale jest to bardzo mało prawdopodobne, ponieważ największy klawisz na fortepianie to C8 (4186Hz). Czy robię coś źle?
Pacerier

3
@Pacerier Nie, ale zmieniłeś nieco swoje pytanie. Próbkę gwizdka dla psa można łatwo zidentyfikować, ponieważ częstotliwość o najwyższym szczycie w widmie jest również najwyższą częstotliwością, a jednocześnie nutą dominującą. W przypadku muzyki najwyższa częstotliwość niekoniecznie jest najwyższą nutą, ponieważ nuta grana przez instrument składa się z wielu częstotliwości.
slhck

@slhck Ic, myślałem, że moglibyśmy odgadnąć notatkę, gdybyśmy mieli częstotliwość, wygląda na to, że nie jest to takie proste ..
Pacerier,

@Pacerier: Jeśli ustawisz Size na wyższą wartość, uważam, że może to dać bardziej precyzyjne wyniki i wyeliminować niektóre harmoniczne.
James P

2
@Pacerier Nie, to naprawdę nie jest tak proste. Wykrywanie skoku wymaga najpierw przekształcenia kształtu fali w widmo częstotliwości (szybka transformata Fouriera), a następnie zastosowania filtrów (głównie dolnoprzepustowych) i kolejnej rundy filtrów. Jeśli nie znajdziesz narzędzia, które śledzi wysokość dźwięku w czasie, to, czego szukasz, będzie naprawdę trudne. Możesz zajrzeć do narzędzi korekcji głosu, takich jak Melodyne .
slhck
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.