2011-02-07 27 views
5

Ostatnio poprosiłem to pytanie: How to get the fundamental frequency from FFT? (w rzeczywistości nie potrzeba, aby ją przeczytać)Jak korzystać z cepstral?

Moje wątpliwości teraz go: jak korzystać algorytm cepstralnego?

Po prostu nie wiem jak go używać, ponieważ jedynym znanym mi językiem jest ActionScript 3 iz tego powodu mam kilka referencji na temat natywnych funkcji znalezionych w języku C, Java i tym podobnych, i jak powinny wdrożyć je w AS. Większość artykułów jest o tych językach =/ (althought, odpowiedzi w innych językach niż mile widziane, tylko wyjaśnić, jak skrypt działa proszę)

artykułów znalazłem o cepstralnego znaleźć podstawową częstotliwość wyniku FFT powiedział mi, że powinienem to zrobić:

sygnał → FT → abs() → kwadratowy → Rejestr → FT → abs() → cepstrum kwadratowy → mocy

matematycznie: | F {log (| F {f (t)} | ²)} | ²

Ważne informacje:

  • Zajmuję się tworzeniem tuner gitarowy w błysku
  • Jest to pierwszy raz mam do czynienia z zaawansowanym dźwięku
  • Używam FFT wyodrębnić kosze częstotliwości z sygnału, który dociera użytkownika mikrofon, ale utknąłem w uzyskaniu częstotliwości podstawowej z niego

nie wiem:

  • Jak zastosować kwadrat w ARRAYU (to znaczy, dane, które daje mi FFT to tablica. Czy powinienem pomnożyć to samo? ActionScript debuguje błędy podczas próby fftResults * fftResults)
  • Jak zastosować "log". Nie wiedziałbym, jak to zastosować, nawet gdybym miał jeden numer.
  • Jaka jest różnica między złożonymi cepstralami i cepstralami mocy. Ponadto, z czego mam ich użyć? Próbuję stworzyć tuner gitarowy.

Dzięki!

Odpowiedz

1

Istnieje wiele sposobów na znalezienie częstotliwości podstawowej (F0).

Dla języków takich jak Java itp. Istnieje wiele bibliotek z już wdrożonymi tego typu algorytmami (można studiować ich źródła).

  • MFCC (oparty na cepstral) zaimplementowany w Comirva (open source).
  • Audacity (wersja beta!) (Open Source) przedstawia cepstrum, autocorellation, zwiększoną autocorellation,
  • Yin podstawie autokorelacji (example)
  • Znalezienie max wartości sygnałów po FFT

Wszystkie te algorytmy mogą bądź bardzo pomocny dla ciebie.Najłatwiejszym sposobem na uzyskanie F0 (jedna wartość w Hz) byłoby użycie Yin.

+0

Czy te metody są precyzyjne, aby stworzyć tuner gitarowy? To znaczy ... potrzebuję naprawdę wysokiej precyzji! –

+0

Zależy to od wielu rzeczy - od jakości mikrofonu, odgłosów itp. Czasami potrzebne są również pewne algorytmy odszumiania. Możesz uruchomić ten przykład Yin - jest to aplikacja, która przechwytuje dźwięk z mikrofonu i wyświetla f0 - test i weryfikuj za pomocą normalnego (sprzętowego) tunera. – mmatloka

+0

Przeczytałem połowę tego: http://recherche.ircam.fr/equipes/pcm/cheveign/ps/2002_JASA_YIN_proof.pdf to wygląda na rodzaj dokumentacji, ale to smaży mój mózg. Nie chcę cię denerwować, ale czy powiesz mi, jak powinienem wprowadzić te równania? W sygnale, w wynikach fft i jak? bardzo dziękuję za pomoc! –

6

Należy zauważyć, że wynik FFT jest tablicą złożonych wartości, tj. Każdy bin = re + j*im. Myślę, że możesz po prostu połączyć operacje abs i kwadratowe i obliczyć re*re + im*im dla każdego bin. Daje to pojedynczą dodatnią wartość dla każdego pojemnika i oczywiście można łatwo obliczyć wartość logu dla każdego pojemnika. Następnie musisz wykonać drugą FFT na tym logarytmie danych w kwadracie i ponownie używając wyjścia tego drugiego FFT obliczysz re*re + im*im dla każdego pojemnika. Otrzymasz wtedy tablicę wartości dodatnich, które będą miały jeden lub więcej szczytów reprezentujących podstawową częstotliwość lub częstotliwości twojego wejścia.

+0

przykład tablicy, którą otrzymuję: [0.123123,0.4809,0.0498356,0.000231,82.31240987,0.1230987 ................. ....................... wartość 1020, wartość 1021, wartość 1022, wartość 1023, wartość 1024]. Te wartości to tylko liczby. Nie są skomplikowane, prawda? –

+0

@Lucas: zależy to od konkretnego FFT, którego używasz, w jaki sposób dane wejściowe i wyjściowe są zorganizowane. Niektórzy będą używać złożonego typu danych, niektórzy będą wstawiać części rzeczywiste i urojone, a niektóre będą miały wszystkie rzeczywiste części w pierwszej połowie tablicy i części urojonych w drugiej (dwie tablice, efektywnie) - musisz przeczytać i zrozumieć dokumenty dla wybranego FFT. –

+0

@PaulR: Wykonanie FFT na N próbek daje N wartości, które odpowiadają N/2 liczb zespolonych (pojemników). Ale po obliczeniu wielkości kwadratowej pozostaję tylko z wartościami N/2, które przy FFTing ponownie dają tylko liczby zespolone N/4. Czy to prawda? Jak obliczyć częstotliwość bin po drugim FFT? Czy możesz poprawić/pomóc mi z tym? – Ravi

2

Autokorelacja to najłatwiejsze i najbardziej logiczne podejście oraz najlepsze miejsce do rozpoczęcia.

Aby to zadziałało, należy rozpocząć od prostej autokorelacji, a następnie, jeśli to konieczne, poprawić ją po obrysie dostarczonym przez YIN. (YIN opiera się na autokorelacji z udoskonaleniami, ale to, czy będziesz potrzebować tych udoskonaleń, zależy od szczegółów twojej sytuacji.) W ten sposób możesz nauczyć się, jak idziesz, zamiast próbować zrozumieć całość w jednym ujęciu.

Chociaż podejścia FFT również mogą działać, są nieco bardziej zagmatwane. Problem polega na tym, że tym, o czym naprawdę chodzi, jest okres, który nie jest dobrze reprezentowany przez FFT. Brakujący fundament jest tego dobrym przykładem, gdzie jeśli masz 2Hz i 3Hz, podstawą jest 1Hz, ale nigdzie w FFT, podczas gdy 1Hz jest oczywiste w reprezentacji opartej na czasie (np. Autokorelacja). Dodajmy do tego, że podteksty niekoniecznie są harmoniczne, a hałas itp. ... a wszystkie te problemy sprawiają, że najlepiej zacząć od bezpośredniego podejścia do problemu.

+0

Czy znasz jakiś kod autokorelacyjny, aby mi pokazać? Czy w pewnym momencie jest autokorelacja oparta na FFT? –

+0

Autokorelacja jest bardzo łatwa do wdrożenia, ale dokładnie to, co zrobisz, będzie zależeć od dostępnych narzędzi i nie znam ActionScript. Większość bibliotek, które wykonują matematykę na macierzach, ma funkcję "korelacji", a następnie korelują dane ze sobą. Jeśli nie masz tego typu rzeczy, oto przykład C++ (http://www.koders.com/cpp/fidEB813F60127CA4FA79CE6ACDF6741303707951AD.aspx?s=include). Ale łatwo jest napisać własną, po prostu pomnóż obiekt z przesuniętą wersją samego siebie. – tom10

+0

Druga część pytania: Czasami szybsze jest obliczanie autokorelacji za pomocą FFT, ale na razie pomyśl o tym wyłącznie jako sztuczka obliczeniowa. Można to zrobić w dowolny sposób, z FFT lub bez niego. – tom10