Od numeru X rozpoczynam cykl wykładów poświęconych syntezie i przetwarzaniu dźwieku. Kilka pierwszych służy przypomnieniu podstawowych pojęć z fizyki (akustyki) potrzebnych w dalszych wykładach.
Analiza harmoniczna – dokładniej.
Fragment ten przeznaczony jest dla osób z nieco większym przygotowaniem matematycznym. Osoby, które przeczytały poprzednie fragmenty – mogą go przeskoczyć bez szkody dla zrozumienia dalszych części.
Transformacja Fouriera.
Transformacja Fouriera jest operacją matematyczną przekształcającą funkcję ciągłą zależną od czasu w inną funkcję ciągłą zależną od częstotliwości.
Definicja ta nie jest całkiem dokładna, bowiem transformację Fouriera można stosować także do innych funkcji nie mających nic wspólnego z czasem, ani częstotliwością. Jednakże w zastosowaniu do dźwięku taka definicja wydaje się być wystarczająca, zwłaszcza, że w zastosowaniach muzycznych używana bywa praktycznie wyłącznie w takiej interpretacji. Warto ponadto zauważyć, że aby transformacja Fouriera była wykonalna, rozpatrywana funkcja musi spełniać tak zwane warunki Dirichleta. Dla dźwięku można przyjąć, że praktycznie są one zawsze spełnione.
Funkcję wyjściową nazywamy oryginałem, zaś rezultat przekształcenia transformatą. Transformacja Fouriera opisana jest wzorem:
gdzie: X(f ) – transformata,
x(f) – oryginał,
e – 2.718281828459..,
π – 3.141592653589..,
i - jednostka urojona,
f – częstotliwość,
t – czas.
Odnosząc powyższe do dźwięku: x(f) (oryginał) jest to dźwięk przedstawiony jako funkcja czasu zaś X(f) (transformata) jest to jego widmo przedstawione jako funkcja częstotliwości. Odwrotna Transformacja Fouriera. Transformacja Fouriera jest operacją odwracalną. Oznacza to, że jeżeli dla jakiejś funkcji obliczymy prostą transformację Fouriera, a następnie wynik poddamy odwrotnej transformacji Fouriera, to otrzymamy z powrotem funkcję wyjściową. Prostą i odwrotną tranformację Fouriera opisują wzory:
Prosta transformacja Fouriera (dla przypomnienia):
Odwrotna transformacja Fouriera:
gdzie: X(f ) – transformata,
x(f) – oryginał,
e – 2.718281828459..,
π – 3.141592653589..,
i - jednostka urojona ,
f – częstotliwość,
t – czas.
Jeżeli więc jakiś dźwięk poddamy transformacji Fouriera, to otrzymamy jego widmo. Jeżeli zaś to widmo poddamy odwrotnej transformacji Fouriera – otrzymamy z powrotem dźwięk wyjściowy. Warto jednak zauważyć, że jest to możliwość teoretyczna, zagwarantowana jedynie dla obliczeń analitycznych. Aby otrzymać w praktyce funkcję wyjściową musimy zapewnić dostateczną dokładność obydwu operacji.
Dygresja: Można to przyrównać do operacji mnożenia i dzielenia. Podzielenie, a następnie pomnożenie liczby przez dowolne x, daje znowu tę liczbę, pod warunkiem jednak wystarczającej dokładności. Bardzo łatwo można rzecz uchwycić intuicyjnie wykonując proste doświadczenie z użyciem zwykłego kalkulatora. W tym celu trzeba wykonać takie działania:
UWAGA: Obliczenia wykonałem na moim kalkulatorze (TI-34, Texas Instruments) z 10cyfrowym wskaźnikiem. Na innych kalkulatorach mogą być inne wyniki, ale zasada pozostaje w mocy. Punkty 3..5 są konieczne ponieważ kalkulator wykonuje obliczenia z większą dokładnością niż to widać na wskaźniku i automatycznie zaokrągla wyniki. Jeżeli więc po prostu podzielimy 1 przez 1951 i znowu pomnożymy – otrzymamy jeden. Ponowne wpisanie wyniku powoduje (celową tutaj) utratę dokładności. Podobne eksperymenty można wykonać z parami funkcyj sin i arcsin, ex i ln(x) a także innymi. Koniec dygresji.
Dyskretna Transformacja Fouriera.
Dźwięki, które analizujemy w praktyce muzycznej z reguły nie są opisane żadną funkcją matematyczną (to znaczy – zasadniczo możnaby to zawsze zrobić; praktycznie jednak byłoby to kłopotliwe aż do zupełnej nieopłacalności ), lecz zarejestrowane na jakimś nośniku lub w pamięci komputera. Nie dysponujemy więc żadną funkcją matematyczną, a jedynie tablicą liczb. Jeśli więc chcemy obliczyć w takim wypadku transformacje Fouriera musimy użyć jej w innej postaci zwanej Dyskretną Transformacją Fouriera (ang: Discrete Fourier Transform - DFT) w przypadku prostej, lub Odwrotną Dyskretną Transformacją Fouriera (ang: Inverse Discrete Fourier Transform - IDFT) w przypadku transformacji odwrotnej. Opisują je poniższe wzory:
dla k = 0,1,2,....N-1,
dla n = 0,1,2,....N-1.
gdzie: X(k) – wartość k-tej próbki widma,
x(n) – wartość n-tej próbki dźwięku,
N – całkowita ilość próbek
e – 2.718281828459..,
pi – 3.141592653589..,
j - jednostka urojona .
Transformacja Fouriera wyrażona w tej postaci pozwala wprawdzie na obliczenia na wartościach dyskretnych, wymaga jednak wykonania wielu złożonych rachunków. W celu obliczenia DTF (jak również IDFT) dla N próbek sygnału koniecznym jest wykonanie N2 operacji. Obliczenie transformaty 100-punktowej wymaga więc 10 000 operacji, 1024-punktowej już 1 048 576 operacji, zaś 65536-punktowej 4 294 967 296 operacji. Liczba potrzebnych operacji przyrasta, jak widać bardzo szybko (z kwadratem N).
Szybka Transformacja Fouriera (FFT).
Nieekonomiczność obliczeniowa DTF stała się bodźcem do poszukiwania bardziej efektywnych metod obliczeniowych. Rezultatem tych prac było opracowanie znacznie wydajniejszego algorytmu zwanego Szybką Transformacją Fouriera (ang: Fast Fourier Transform - FFT).
Szybka transformacja Fouriera jest w istocie tym samym, co poprzednio omówiona transformacja dyskretna; daje też takie same wyniki. Jedyna różnica polega na użyciu innego algorytmu (sposobu) obliczeń (zaproponowanego przez J. W. Cooley’a i J.W. Tukey'a w roku 1965).
Algorytm FFT zapewnia dużą szybkość obliczeń, ponieważ dla N próbek sygnału wymaga tylko N log2(N) operacji. (Danych powyższych nie należy traktować bezkrytycznie, ponieważ mogą one zależeć od sposobu napisania programu, a także nawet i samej budowy konkretnego komputera; dają one jednak dobre pojęcie o przyspieszeniu obliczneń, jakie umożliwia algorytm FFT.) Tak więc na przykład obliczenie 1024-punktowej FFT wymaga 10 240 operacji (dla porównania: DFT wymaga w tym przypadku 1 048 576 operacji). Nadto różnica szybkości na korzyść FFT wzrasta ze wzrostem N.
Algorytm FFT działa założenia na blokach danych (liczb) będących potęgami dwójki (2, 4, 8 .. 256, 512, 1024..) Zasadniczo możnaby tu użyć dowolnych liczb, ale dla potęg dwójki algorytm ten jest najwydajniejszy. Jeżeli użyjemy innej liczby danych – algorytm dopełni ją „automatycznie” do najbliższej liczby z powyższego szeregu. Jak z tego widać najkorzystniejsze jest użycie grup danych o długości będącej potęgą dwójki – pozwala to maksymalnie wykorzystać zalety tej metody.
Szczegółowy opis działania algorytmu FFT wykracza poza zakres tego wykładu; rzadko zresztą konieczna jest jego szczegółowa znajomość, zwłaszcza, że jest on powszechnie (i bezpłatnie) dostępny w sieciach komputerowych. W praktyce więc warto raczej zapoznać się wnikliwie ze sposobem jego użycia niż szczegółami jego działania.
[cdn]
[mc]