Wykorzystanie Szybkiej Transformaty Fouriera do strojenia instrumentów gitarowych na urządzeniach mobilnych. Kamil Nieradkiewicz Wydział Inżynierii Mechanicznej i Informatyki Kierunek Informatyka, Rok II kamil.nieradkiewicz@gmail.com Streszczenie W poniższej pracy pokazano metodę wyznaczania dominujacej częstotliwości w wejściowym sygnale dźwiękowym oraz określenia częstotliwości bazowej na podstawie składowych częstotliwości sygnałów harmonicznych. Zebrane w ten sposób informacje wykorzystano do Strojenia instrumentów gitarowych. 1 Wstęp Aplikacja została zaprojektowana z myślą o smartfonach. Wybrano system BADA samsunga, który umożliwia tworzenie aplikacji z użyciem języka C++. Program ma za zadanie znalezienie częstotliwości granej struny, porównanie jej z częstotliwością poszczególnych dźwięków oraz umożliwienie użytkownikowi wyregulowania jej naciągu w taki sposób, aby dostroić każdą strunę do pożądanego dźwięku. 2 Dźwięki i strój gitary Tak jak zdecydowaną większość instrumentów, tak i gitarę stroi się do dźwięku kamertonu, który jest nazwany dźwiękiem a1 i ma dokładnie 440Hz. Gitary: klasyczna, akustyczna, elektroakustyczna oraz elektryczna posiadają 6 strun nazwanych (od najniższej) E, A, d, g, h, e1. W standardowym stroju gitary, który będzie tutaj omówiony, dźwięk kamertonu (a1) znajduje się na piątym progu najcieńszej struny (e1). Strojąc gitarę do dźwięku kamertonu, uzyskujemy nastrojoną najwyższą strunę. Posłuży nam ona jako referencja dla strojenia kolejnych, niższych strun. Na każdej niższej strunie, da się wydobyć dźwięk struny od niej wyższej i dzięki temu jedna nastrojona struna wystarczy do nastrojenia całej gitary. W tym momencie jednak najważniejsze jest, jak konkretne struny (dźwięki strun) odpowiadają sobie wzajemnie. Do tej pory bowiem określono częstotliwość dźwięku granego na piątym progu struny e1 (dźwięk a1-440hz). Aby wydobyć ze struny niższej dźwięk struny wyższej od niej należy strunę niższą przycisnąć na odpowiednim progu. I tak, aby uzyskać dźwięk czystej struny e1 na strunie h, należy tę strunę nacisnąć na piątym progu. [1] Cały strój pokazuje rys. 1 1
Rys.1 Należy teraz zaznajomić się z bardzo potrzebnym pojęciem oktawy. Oktawa jest to odległość dzieląca dźwięk od dźwięku o częstotliwości dwukrotnie wyższej lub niższej. Oktawa dzieli się na 6 tonów czyli 12 półtonów. Co ważne, półton jest odwzorowany jako jeden próg na gitarze. [2] Wiedząc, że oktawa dzieli dźwięki o częstotliwościach dwukrotnie wyższych lub niższych, oraz, że na gitarze, oktawie odpowiada 12 progów, łatwo policzyć, że zmiana częstotliwości o jeden próg to iloczyn bądź iloraz częstotliwości początkowej i 12 2. Znając już zmianę częstotliwości na każdym progu gitary oraz ilość progów różniących dźwięki na poszczególnych strunach, można w prosty sposób obliczyć częstotliwości każdej z nich. [3] Wynik przedstawia rys. 2. Rys.2 3 Dźwięk a dane cyfrowe Teraz należy spojrzeć na dźwięk z nieco innej perspektywy. Urządzenia cyfrowe, a w tym przypadku telefon komórkowy zbierają i zapisują sygnał dźwiękowy jako możliwe i proste do zinterpretowania dane. Sygnał dźwiękowy jest próbkowany z częstotliwością Fs i wartość amplitudy próbkowanego sygnału w każdej próbce jest zapisywana jako dane rzeczywiste (bądź całkowite) w postaci wektora bądź innej reprezentacji jednowymiarowego bufora danych. Co ważne i niestety niekorzystne dla realizacji tego projektu, takie podejście do przechwytywania sygnału daje bezpośredni dostęp jedynie do amplitudy sygnału w danym momencie czasu. Aby znaleźć składowe częstotliwości dźwięków należy wykonać na sygnale wejściowym dyskretną transformatę Fouriera (DST). DST pozwala na przejście z zapisu amplitudowego do zapisu częstotliwościowego[4] sygnału. Bezpośrednie wykonanie DST wiąże się jednak z ogromną złożonością obliczeniową O (n 2 ). 2
4 Szybka transformata Fouriera Szybka Transformata Fouriera (FFT) jest zoptymalizowaną, przyspieszoną metodą obliczania Dyskretnej Transformaty Fouriera (DST). Istnieje wiele implementacji metody obliczania FFT. Wynikiem działania Transformaty Fouriera jest wektor liczb zespolonych przechowujący w części rzeczywistej moc składowej sygnału o danej częstotliwości, natomiast w części urojonej jej przesunięcie fazowe. Pomimo, że dla realizacji naszego celu, informacje dotyczące przesunięcia fazowego są zupełnie zbędne, operacje na liczbach zespolonych są konieczne do obliczenia Transformaty. W związku z tym nie było możliwe zrezygnowanie z obliczania przesunięć fazowych oraz operacji na liczbach zespolonych na rzecz szybkości obliczeń. Jedyną przeprowadzoną optymalizacją jest zmiana typu danych struktury liczby urojonej na dane pojedyńczej precyzji. Z racji dużej ilości mnożeń, znaczących dla wyniku danych, przez liczby mniejsze od 1, dalsze zmniejszanie dokładności z typu zmiennoprzecinkowego pojedyńczej precyzji do typu liczb całkowitych również nie było możliwe. Do obliczenia Szybkiej Transformaty Fouriera został użyty algorytm Cooley-Tukey zaimplementowany przez: LIBROW, wraz z wyżej opisanymi zmianami. [5] Najważniejszym warunkiem wstępnym użycia algorytmu Cooley-Tukey jest rozmiar transformaty (rozmiar danych wejściowych) który musi być potęga liczby 2! Pierwszym krokiem algorytmu Cooley-Tookey jest odpowiednie uporządkowanie danych. Polega ono na odwróceniu numerów indeksów danych wejściowych zapisanych w systemie binarnym. Przykład obrazuje rys. 3 Rys.3 Podstawową operacją algorytmu FFT jest tzw. motylek(ang. butterfly). Zasadę działania motylka przedstawia rys. 4 Rys.4 3
Dla transformaty o rozmiarze (2 n ) należy wykonać n szeregów operacji motylkowych, jak pokazano na rys. 5. Rys.5 5 Aplikacja BADA i obsługa strumienia audio Aplikacja została zaprojektowana i napisana pod system Samsung Bada. Jest to system operacyjny dla smartfonów samsunga. Do testów aplikacji posłużył model Samsung Wave S8500 z systemem BADA 1.2. Środowisko BADA zapewnia wsparcie i obsługę podstawowych funkcji takich jak odtwarzanie audio, nagrywanie do pliku bądź nagrywanie do bufora danych. W aplikacji została użyta ostatnia funkcjonalność. Zapewnia ją klasa AudioIn. System umożliwia pełną obsługę zdarzeń takich jak np: niski stan baterii, wstrzymanie/wygaszenie ekranu bądź przerwania (np. ROZMOWA PRZYCHODZACA). Obsługę przerwania AudioIn przez połączenie przychodzące pokazuje rys. 6 Rys.6 [6] 4
W trakcie inicjalizacji AudioIn, przed rozpoczęciem nagrywania, muszą zostać zdefiniowane parametry nagrania takie jak. Fs - częstotliwość próbkowania ( 8000 Hz 48000 Hz ) Typ próbki : 8 bit bez znaku / 16 bit ze znakiem Ilość kanałów: 1-mono, 2-stereo Urządzenie wejściowe: mikrofon Ponadto, dla funkcjonalności aplikacji, kluczową rolę odgrywają takie parametry jak: Wielkość ramki (bufora danych) Wielkość transformaty Należy uzmysłowić sobie jaki wpływ mają na wydajność i dokładność poszczególne parametry. Aby uzyskać satysfakcjonujący rezultat należy znaleźć kompromis pomiędzy dokładnością wyznaczanej częstotliwości a czasem analizy sygnału. Biorąc pod uwagę ograniczone możliwości obliczeniowe telefonu komórkowego, bardzo ważne jest aby starannie dobrać parametry nagrywania. Kluczowymi dla końcowego efektu wielkościami charakteryzującymi analizę naszego sygnału jest jej dokładność oraz czas uzyskania jednego wyniku. Dokładność analizy można określić na podstawie kroku częstotliwości różniącego kolejne próbki sygnału wynikowego transformaty. Freq = t 2* Fs FFT size (1) Fs Bu f f orsize (2) Czas otrzymania wyniku jest mniejszy bądź równy dwukrotności czasu potrzebnego na zapełnienie jednego bufora danych. Jest to spowodowane tym, że w trakcie nagrywania (zapełniania bufora) nie możemy zacząć go jeszcze analizować. Natomiast czas analizy bufora nie może być dłuższy od czasu nagrywania bufora kolejnego, co spowodowałoby rosnącą w nieskończoność ilość danych do analizy i w efekcie zawieszenie urządzenia. Kluczowym więc dla nas czasem dostępnym na analizę jednego bufora będzie czas: T max = Fs Bu f f orsize (3) Po dużej ilości prób i optymalizacji, udało się znaleźć wartości parametrów nagrywania oraz transformaty, które spełniły oczekiwania czasowe i dokładnościowe: Fs : 11025 Wielkość ramki : 2048 Wielkość transformaty : 16384 Typ próbki : 8 bit bez znaku Ilość kanałów: 1-mono Co daje: Freq = 0,672 Hz T max = 0,185 sec 5
6 Częstotliwość bazowa Znalezienie maksymalnej wartości częstotliwości składowych sygnału nie jest wystarczające do określenia częstotliwości granego dźwięku (szarpniętej struny). Dźwięki harmoniczne a w szczególności sygnały instrumentów strunowych cechuje właściwość niezmiernie utrudniająca rozpoznanie strojonej struny. Problemem jest interpretacja wyników analizy sygnału, gdyż zagrana częstotliwość może wystąpić wielokrotnie w wynikach analizy. Tzn. grając dźwięk o częstotliwości 110 Hz w wyniku analizy możemy zobaczyć składowe harmoniczne o częstotliwościach równych wielokrotności 110 Hz czyli: 110Hz, 220Hz, 330Hz itd. Co jeszcze ważniejsze częstotliwość bazowa wcale nie musi pojawić się w wyniku analizowanego sygnału, jest to tzw. paradoks Missing Fundamental [7]. Zjawisko to jest powszechnie wykorzystywane i pozwala m.in. na granie tonów odbieranych przez słuchacza za niskie przez głośniki średniotonowe. Przypuśćmy, że słuchając zwykłego radia grana jest piosenka z linią melodyczną zawierającą dźwięki basowe o częstotliwości 80 Hz. Radio nie jest wyposażone w głośnik niskotonowy a najniższą możliwą do zagrania przez nie częstotliwością jest 110Hz. Aby poradzić sobie z odtworzeniem niższych tonów radio spreparuje sygnał i zagra wielokrotności jego częstotliwości tj: 160Hz, 240Hz, 320Hz, 400Hz,... Pozwoli to na zinterpretowanie przez słuchacza tak zagranego dźwięku jako dźwięk o częstotliwości 80Hz mimo, że nie został on tak na prawdę zagrany. Odbiorca rozróżni ten dźwięk i uzna za niższy od dźwięku np. 120 Hz.[8] Jednak to, co pomaga producentom niższej klasy sprzętu audio, zdecydowanie przeszkadza przy badaniu częstotliwości bazowej sygnału. Biorąc pod uwagę, że aplikacja musi sprawdzić się w warunkach rzeczywistych, nieidealnych, nawet wielokrotności częstotliwości bazowej mogą pojawiać się nieco nieregularnie. 7 Algorytm określajacy częstotliwość bazową Program implementuje autorski algorytm mający za zadanie określić częstotliwość bazową analizowanego sygnału na podstawie wyróżnionych, dominujących częstotliwości składowych. W uproszczeniu znajduje on kolejne znaczące (o dużej mocy) częstotliwości analizowanego sygnału oraz sprawdza ile z nich jest wielokrotnością którejś z poprzednich znalezionych częstotliwości. Na wypadek braku częstotliwości bazowej sprawdza on również wielokrotności połowy częstotliwości pierwszego, drugiego lub obu pierwszych częstotliwości (w zależności od ilości znaczących częstotliwości znalezionych w analizowanym sygnale). Częstotliwość która ma najwięcej wielokrotności w analizowanym sygnale zostaje uznana za bazową. Jednak w przypadku analizy wielokrotności połowy pierwszej/drugiej znalezionej częstotliwości(która nie ma odzwierciedlenia w wynikach transformaty jako częstotliwość składowa), ilość ta musi przekraczać ilość znalezionych wielokrotności sygnału, który został znaleziony jako częstotliwość składowa o co najmniej 2. 6
Rys.7 Na rys.7 widać graf przedstawiający moc składowych częstotliwości sygnału analizowanego. Można dostrzec 4 wierzchołki, z których najwyższy jest drugi a ostatni leży poniżej poziomej, czerwonej linii (czyli poniżej przyjętego poziomu szumu). Analizując ten sygnał, algorytm znajdzie i zapisze częstotliwości 3 wierzchołków. Widać wyraźnie, że są one rozmieszczone w równych odstępach (początek wykresu nie zaczyna się od 0Hz lecz ok 60Hz). Zdecydowanie dominującą częstotliwością w analizowanym sygnale jest częstotliwość drugiego wierzchołka. Jednak sprawdzając wielokrotności znalezionych częstotliwości program zidentyfikuje poprawnie częstotliwość wierzchołka pierwszego jako częstotliwość bazową. Jest to możliwe, dzięki zliczaniu i porównywaniu ilości wielokrotności częstotliwości kandydującego wierzchołka. Przeprowadzona również zostanie analiza częstotliwości będącej połową częstotliwości pierwszego wierzchołka. I tak, o ile wierzchołek pierwszy ma 2 wielokrotności (wierzchołki 2 i 3), tak połowa jego częstotliwości miałaby 3 wielokrotności (wierzchołki 1, 2 oraz 3). Jednak dzięki dodatkowemu warunkowi, opisanemu wyżej nie zostanie ona rozpoznana jako częstotliwość bazowa. Ponadto, program poddaje analizie dane z zakresu 60HZ-460Hz, dzięki czemu pomija zazwyczaj duże szumy na niskich częstotliwościach i umożliwia z zadawalającym marginesem stroić najwyższe struny gitary. Dodatkowym zabezpieczeniem jest rezygnacja z analizy sygnału, jeżeli jego moc nie będzie wystarczająca. Pozwala to na zaoszczędzenie obciążenia procesora i zwiększenie wydajności energetycznej urządzenia, poprzez zaniechanie analizy sygnału w momentach, kiedy żadna ze strun nie wydaje dźwięku. Kolejnymi istotnymi mechanizmami, pozwalającymi na dokładniejsze strojenie instrumentu są: wykorzystanie pojawiających się wielokrotności częstotliwości do określenia częstotliwości bazowej poprzez analizę nie tylko wierzchołka częstotliwości bazowej ale również różnic częstotliwości pomiędzy kolejnymi wierzchołkami. 7
zachowywanie poprzednich wyników częstotliwości i wyświetlanie wyniku średniego z 4 ostatnich prób. 8 Podsumowanie Dzięki rosnącym możliwościom, prężnie rozwijającego się przemysłu smartfonów i telefonów komórkowych. Oraz dzięki dużemu potencjałowi obliczeniowemu dzisiejszych urządzeń tego typu, aplikacja na telefony z systemem BADA może z powodzeniem pozwolić na strojenie gitary z zadawalającą precyzją. Umożliwia to wykorzystanie szybkiej metody obliczania Dyskretnej Transformaty Fouriera oraz złożona analiza otrzymanych wyników. Nie można jednak uznać, że dorównuje ona profesjonalnym stroikom muzycznym. Mimo tego, jest to dobra alternatywa dla osób które w przeciwieństwie do stroika, telefon noszą przy sobie zawsze. Literatura [1] http://gitaradlapoczatkujacych.pl/metody-strojenia-gitary.html [2] http://gitaradlapoczatkujacych.pl/krotka-historia-poltonow.html [3] http://gitaradlapoczatkujacych.pl/zakres-czestotliwosci.html [4] http://elektronikab2b.pl/technika/3096-dyskretna-transformata-fouriera [5] http://www.librow.com/articles/article-10 [6] http://developer.bada.com/help/index.jsp?topic=/com.osp.devguide.help/ [7] http://www.hydrogenaudio.org/forums/lofiversion/index.php/t40690.html [8] http://www.ihear.com/pitch/paradoxical.html 8