Czytałem fragmenty w Internecie, ale po prostu nie mogę tego wszystkiego poskładać. Mam podstawową wiedzę na temat sygnałów / DSP, które powinny być wystarczającymi warunkami do tego. Jestem zainteresowany ostatecznym kodowaniem tego algorytmu w Javie, ale jeszcze go nie rozumiem i dlatego tu jestem (liczy się to jako matematyka, prawda?).
Oto, jak myślę, że to działa wraz z lukami w mojej wiedzy.
Zacznij od próbki mowy audio, powiedz plik .wav, który można odczytać z tablicy. Nazwij tę tablicę , gdzie wynosi od (więc próbek). Wartości odpowiadają chyba natężeniu dźwięku - amplitudom.n 0 , 1 , … , N - 1 N.
Podziel sygnał audio na wyraźne „klatki” o długości około 10 ms, przy założeniu, że sygnał mowy jest „stacjonarny”. Jest to forma kwantyzacji. Więc jeśli częstotliwość próbkowania wynosi 44,1 KHz, 10 ms jest równe 441 próbkom lub wartościom .
Wykonaj transformatę Fouriera (FFT w celu obliczeń). Czy to się dzieje na całym sygnale lub na każdej oddzielnej ramce ? Myślę, że jest różnica, ponieważ ogólnie transformacja Fouriera patrzy na wszystkie elementy sygnału, więc dołączył z połączone z \ ldots \ mathcal F (x_N [n]), gdzie x_i [n] to mniejsze ramki. W każdym razie powiedzmy, że robimy FFT i kończymy na X [k] przez resztę tego.F ( x [ n ] ) ≠ F ( x 1 [ n ] ) F ( x 2 [ n ] ) … F ( x N [ n ] ) x i [ n ] X [ k ]
Mapowanie do skali Mel i logowanie. Wiem, jak konwertować regularne liczby częstotliwości na skalę Mel. Dla każdego od (na osi „x” jeśli mi pozwoli), można zrobić wzór tutaj: http://en.wikipedia.org/wiki/Mel_scale . A co z „wartościami y” lub amplitudami ? Czy po prostu pozostają takie same wartości, ale są przesunięte do odpowiednich miejsc na nowej osi Mel (x-)? Widziałem w pewnym artykule, że jest coś o rejestrowaniu rzeczywistych wartości ponieważ wtedy, gdy gdzie jeden z tych sygnałów jest przypuszczalnie szumem, nie chcesz , operacja dziennika na tym równaniu zamienia multiplikatywny hałas w szum addytywny, który, mam nadzieję, może być filtrowany (?).
Ostatnim krokiem jest pobranie DCT zmodyfikowanego z góry (jednak skończyło się to modyfikacją). Następnie bierzesz amplitudy tego końcowego wyniku i to są twoje MFCC. Przeczytałem coś o wyrzucaniu wysokich częstotliwości.
Staram się więc naprawdę wyjaśnić, jak obliczyć tych facetów krok po kroku i najwyraźniej niektóre rzeczy wymykają mi się z góry.
Słyszałem także o stosowaniu „banków filtrów” (w zasadzie szeregu filtrów pasmowych) i nie wiem, czy odnosi się to do tworzenia ramek z oryginalnego sygnału, czy może tworzysz ramki po FFT?
Wreszcie, jest coś, co widziałem w MFCC mających 13 współczynników?
źródło
Odpowiedzi:
Krok po kroku...
1. i 2 . To jest poprawne. Zauważ, że ramki zwykle się nakładają, na przykład ramka 0 to próbki od 0 do 440; ramka 1 to próbki od 220 do 660; ramka 2 to próbki od 440 do 880 i tak dalej ... Zwróć też uwagę, że do próbek w ramce zastosowano funkcję okna .
3 . Transformacja Fouriera jest wykonywana dla każdej klatki. Motywacja jest prosta: sygnał mowy zmienia się w czasie, ale jest stacjonarny w krótkich segmentach. Chcesz analizować każdy krótki segment osobno - ponieważ w tych segmentach sygnał jest wystarczająco prosty, aby można go było skutecznie opisać kilkoma współczynnikami. Pomyśl o kimś, kto mówi „cześć”. Nie chcesz, aby wszystkie fonemy zwinięte w jednym widmie (FFT zwija informacje czasowe) poprzez analizę całego dźwięku naraz. Chcesz zobaczyć „hhhhheeeeeeeeeeelloooooooooo”, aby rozpoznać słowo etap po etapie, więc należy je podzielić na krótkie segmenty.
4 . „Mapowanie do skali Mela” jest mylące i prawdopodobnie dlatego się mylisz. Lepszym opisem tego kroku byłoby: „Oblicz energię sygnału za pomocą zestawu filtrów dostrojonych do częstotliwości skalowanych według mel”. Oto jak to się robi. Uważamy, że częstotliwości (najczęściej stosowaną wartością jest N = 40 ) w równych odstępach zgodnie ze skalą mel, między 20 Hz (dolna część zakresu słyszenia) a częstotliwością Nyquista. Praktyczny przykład: sygnał jest próbkowany przy 8 kHz i chcemy 40 binsów. Ponieważ 4 kHz (Nyquist) wynosi 2250 mel, częstotliwości środkowe banku filtrów będą wynosić: 0 mel, 2250/39 mel, 2 x 2250/39 mel .. 2250 mel.N. N.= 40
Po zdefiniowaniu tych częstotliwości obliczamy ważoną sumę wielkości FFT (lub energii) wokół każdej z tych częstotliwości.
Spójrz na poniższy obrazek przedstawiający bank filtrów z 12 pojemnikami:
8. przedział ma częstotliwość środkową około 2 kHz. Energia w ósmym przedziale jest uzyskiwana przez zsumowanie ważonych energii FFT w przybliżeniu w zakresie 1600 do 2800 Hz - przy szczytowej wadze około 2kHz.
Nota implementacyjna: Ta wiązka ważonych sum może być wykonana w jednej operacji - mnożeniu macierzy „macierzy banku filtrów” przez wektor energii FFT.
Na tym etapie „podsumowaliśmy” widmo FFT na zbiór 40 (12 na ilustracji) wartości energii, z których każda odpowiada innemu zakresowi częstotliwości. Bierzemy dziennik tych wartości.
źródło
39 mel
pochodzi krok 4?