Informatya medyczna Wczytywanie pliu: Wczytujemy cały pli do pamięci operacyjnej według specyfiacji: agłówe RIFF FMT opcjonalne inne bloi DATA azwa pola Wielość w bajtach Opis chunid Test ASCII RIFF - oreśla standard chunsize Rozmiar całego pliu w bajtach minus 8 bajtów (pola chunid, chunsize) format Test ASCII WAVE chunid Test ASCII fmt_ chunsize Rozmiar tego blou w bajtach minus 8 bajtów (pola chunid, chunsize) audioformat 2 zapis bez ompresji, > uŝyto ompresji numchannels 2 Liczba anałów -mono, 2-stereo samplerate Częstotliwość próbowania 8, byterate Liczba bajtów na seundę (wszystie anały) = samplerate *numchannels*bitspersample/8 blocalign 2 Liczba bajtów na próbę (wszystie anały) = numchannels*bitspersample/8 bitspersample 2 Liczba bitów na próbę (przypadających na jeden anał) 8 lub 6 chunsize Ewentualne dodatowe parametry. Pole moŝe mieć róŝną - 6 długość!!! chunid Unialny test ASCII opisujący ten blo chunsize Rozmiar blou w bajtach data chunsize Dane tego blou chunid Test ASCII data chunsize Rozmiar danych dzwięowych w bajtach = numsamples *numchannels*bitspersample/8 data chunsize Kolejne próbi http://www.sonicspot.com/guide/wavefiles.html Załadamy, Ŝe pli musi być 6-bitowym pliiem mono bez ompresji, w przeciwnym razie wyświetlamy omuniat, Ŝe nie da się wczytać pliu. Dane z nagłówa mają być dostępne w interfejsie. Wyświetlanie pliu - oscylogram: - Wyświetlanie mamy napisać sami bez uŝywania Ŝadnych gotowych bibliote. Wyświetlanie polega na wyrysowaniu olejnych 6-bitowych próbe (czyli liczb od -32tys do 32 tys) z reprezentacji w pamięci na eran. Interfejs musi umoŝliwiać obejrzenie całego pliu dźwięowego: ja i dowolnej jej części:
W przypadu gdy w poziomie na jeden pisel przypada więcej niŝ jedna próba, raczej powinno się: wyznaczyć przedział próbe sładających się na dany pisel, wyznaczyć minimalną i masymalną wartość, w danym piselu narysować olumnę od minimalnej do masymalnej wartości. W przeciwnym przypadu wystarczy zwyłe łączenie puntów liniami (moveto, lineto). Odtwarzanie i nagrywanie: - Interfejs ma umoŝliwiać zaznaczenie dowolnego awała oscylogramu i odtworzenie go. Ma równieŝ umoŝliwiać nagrywanie, czyli: wcisamy przycis nagrywaj nagrywanie rozpoczyna się, wcisamy stop (w dowolnym momencie) nagrywanie ończy się, próbi z dodanym nagłówiem zapisujemy w pliu wave, po czym automatycznie ten pli wczytujemy do programu (czyli wyświetlamy go). Przyładowe bibliotei: - javax.sound Java (doumentacje olejnych wersji VM) - fmod C, C++, C#, Delhi, Visual Basic http://www.fmod.org/ - API systemu operacyjnego - direct (directsound).et (http://www.codeguru.pl/article-82.aspx), http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/htm/directmusic.asp - openal http://www.openal.org/ - PortAudio http://www.portaudio.com/ Analiza czasowa: - Zdefiniować zoienowanie Przed aŝdą analizą dzielimy sygnał na ona. Podział ten zaleŝy od dwóch parametrów: szeroości ona i przesunięcia parametry te mają być dostępne z poziomu interfejsu uŝytownia. Szeroość ona ja i przesunięcie moŝe być wyraŝana w próbach lub miliseundach. Przesunięcie oznacza odległość między początami dwóch sąsiednich oien i moŝe przyjmować wartość z zaresu <,szeroość_ona>. Dla przyładowych parametrów: wyraŝonych w próbach (nie w seundach) szeroość_ona =, przesunięcie = 2, olejne ona to: <, 99>, <2, 9>, <, 39>, <6, 59> Przetworzenie całego pliu polega na przetworzeniu aŝdego ona z osobna. KaŜde ono jest przetwarzanie oddzielnie i niezaleŝnie nie orzysta więc z wyniów innych oien, ani wynii uzysane w tym onie nie są danymi wejściowymi do obliczeń w innych onach. Dodatowo aŝde ono jest przemnaŝane przez funcję ona według schematu: jeŝeli szeroość ona wynosi, a funcja ona jest oreślona na przedziale <A,B>, to wyznaczamy równomiernie rozłoŝonych puntów na przedziale <A,B> x, x,, x -, dla aŝdego z tych puntów wyznaczamy wartość funcji ona f(x ), f(x ),, f(x - ) i aŝdą z tych wartości przemnaŝamy przez odpowiednią (w olejności) wartość sygnału w onie. Dopiero na ta zmodyfiowanym sygnale doonujemy dalszych obliczeń. Wzory róŝnych funcji są dostępne na stronie: http://pl.wiipedia.org/wii/ono_czasowe. W programie mają znaleźć się co najmniej róŝne funcje w tym ono prostoątne i ono Hamminga. Obwiednie wyliczmy według wzoru Obw = x n, gdzie x n są zmodyfiowanymi (patrzy n= wcześniejszy aapit) próbami sygnału wejściowego w pojedynczym onie. Dla jednego ona 2
dostajemy jedną wartość obwiedni, tórą nanosimy na wyres oscylogramu. Umieszczamy ją w środu ona (względem osi O), w pionie natomiast (względem osi OY) salujemy ją niezaleŝnie do oscylogramu najlepiej na górnej połowie oscylogramu, liniowo względem masymalnej wartości obwiedni ze wszystich oien. Drugą zmienną tórą mamy zobrazować jest częstotliwość przejść sygnału wejściowego prze oś O w onie. Obrazujemy ją ta samo ja obwiednię. Kolory: Czarny Zielony iebiesi - oscylogram - obwiednia - częstotliwość przejść przez zero DFT: - Dysretna Transformata Fouriera n ( ) = x( n) W, = () n= n i2π n n n W = e = cos(2π ) i sin(2π ) Przechowujemy sładowe rzeczywiste ja równieŝ urojone. a wyresie przedstawiamy wartości (). Dodatowo w interfejsie ma być dostępny checbox, zamieniający wyres na salę logarytmiczną (decybelową): 2 2 ' = 2log = re + im log MoŜe być sala od zera ( ) ' = 2log max, max masymalna wartość transformaty ze WSZYSTKICH oien zdefiniować to doładniej Ŝe to moduł Dla aŝdego ona liczona jest oddzielna transformata (cały proces oczywiście poprzedzony jest oienowaniem), w związu z tym potrzebne jest jaieś sprzęŝenie z wyresem oscylogramu. Kliając w oscylogram, sprawdzamy, w tóre ono linęliśmy, i wyświetlamy widmo tylo dla tego ona. Kolory: Czerwony iebiesi - widmo DFT - widmo LPC nie dotyczy
Dla szeroości ona, dostajemy wartości transformaty w onie (). -ta wartość odpowiada częstotliwości F = Fp, gdzie F p to częstotliwość próbowania. Wyświetlamy natomiast TYLKO pierwszą połowę uzysanego widma poniewaŝ druga jest jej lustrzanym odbiciem. Prosiłbym równieŝ o zrobienie przynajmniej sali poziomej. FFT: - Szyba Transformata Fouriera, daje w wyniu DOKŁADIE te same wartości co DFT. Jest zaletą jest duŝa szybość obliczeń, a wadą to, Ŝe ilość danych wejściowych musi być potęgą 2 (w podstawowej wersji algorytmu o tórej właśnie mówimy, poniewaŝ są rozszerzenia tego algorytmu, tóre usuwają tą niedogodność). Algorytm przyjmuje ono z próbami o szeroości = 2 s i słada się z 3 etapów:. Podział. Ono dzielimy najpierw na pół, potem aŝdą połówę na pół, itd. Do lewej połowy bierzemy parzyste próbi, do prawej nieparzyste, czyli dla =8 wygląda to ta: 2 3 5 6 7 2 6 3 5 7 2 6 5 3 7 2 6 5 3 7 Zamiast robić to w sposób iteracyjny (według powyŝszego schematu) moŝemy zrobić to w sposób liniowy. Dla ona = 2 s, indesy omóre reprezentowane są na s bitach. JeŜeli indes n-tej omóri przedstawimy binarnie na s-bitach i reprezentację tą odwrócimy (z liczby abcd utworzymy dcba) otrzymamy nowy indes omóri n w tórym ta wartość powinna się znaleźć, np.: = 8, więc s = 3, więc zamiana indesów n na n wygląda ta: n 2 3 5 6 7 n 2 n 2 n 2 6 5 3 7 więc -rową omórę musimy wstawić w -rową omórę, -wszą musimy wstawić w -tą, itd. Ta przemieszane ono słuŝy jao dane wejściowe do następnego etapu. 2. Scalanie Wyjaśnić, Ŝeby jechać po wszystich motylach dla zadanego Jest to operacja odwrotna do podziału z dwóch mniejszych tablic tworzymy tablicę dwa razy więszą, aŝ dojdziemy na samą górę (czyli otrzymamy całe ono). Przy scalaniu orzystamy ze wzoru ' ( ) ( ) () ' ' =, ( ) ( ) 2 = + ' + 2 W A 2 WB ta ja w DFT W zastosowaniu wzoru pomoŝe nam poniŝszy schemat: = 2
następnie = 2 3 2 3 2 3 2 3 następnie = 8 2 3 5 6 7 2 3 5 6 7 Czyli na przyład w drugim rou dla =, otrzymamy równania: = = () = (2) = () = (3) = () + W () W () + W () W Zawsze, niezaleŝnie od, dla danego występują tylo dwa indesy wejściwo-wyjściowe (w naszym przypadu i 2 oraz i 3) i w dodatu dla onretnego te indesy nie występują nigdzie indziej. MoŜemy więc, w ramach optymalizacji robić obliczenia w miejscu, orzystając z dwóch zmiennych roboczych (a nawet z jednej). 3. Unormowanie Otrzymane wartości w tablicy dzielimy przez Spetrogram: - Spetrogram to wyres wszystich widm ułoŝonych olejno jedno obo drugiego. KaŜde widmo (2) (2) (3) (3) ustawiamy pionowo (na sztorc) otrzymując pase, gdzie oś pozioma to częstotliwość, a oś pionowa (od eranu) to amplituda. Zmiany amplitudy powinniśmy reprezentować zmianą oloru. Przeręcając te pasi o 9 w lewo i ustawiając je jeden obo drugiego otrzymamy spetrogram. Powinna teŝ być moŝliwość zmiany na salę logarytmiczną. Spetrogramy do porównania, sale liniowe i logarytmiczne: (szeroość = 6, przesunięcie = 6, ono Hamminga) Łatwy:
Średni: Trudny: