Šis darbas prasidėjo universitete. Koordinuojamas dėstytojo Kęstučio Driaunio. Pradžiai reikia nuskaityti wav failą, taip pat turi būtų galimybė padidinti bei pažymėti ribas bei nupiešti spektograma. Pradžiai darbo tikslas yra: galimybė susižymėti ribas, kur žodis prasdidea, o kur baigiasi bei pamatyti spektrogramą.

Taigi pradedam nuo wav failo skaitymo. Tam mums reikia žinoti jo struktūrą. Taigi wav failą sudaro trys dalys(‘chunks’): “RIFF”, “fmt”, “data”. Visos šios dalys užima 44 baitus. “Fmt” dalyje galite rasti visą jums reikalingą informaciją apie garso failą: audio formatas, kanalų skaičius, diskretizavimo dažnį, bitų skaičių per samplą. “data” dalyje rasime pačius duomenis, kuriuos girdime, kai grojame failą. Plačiau apie šį formatą galite pasiskaityti čia.

Kai jau turime nuskaitytus duomenis tada galime juos atvaizduoti ekrane. Mums reikia žinoti kiek samplų atitenka vienam pikseliui, tam daliname samplų skaičių iš piešiamo paveiksliuko pločio. Tarkime gauname, kad vienam pixeliui atitenka 50 samplų. Galėtume piešti, kas 50 samplą, bet taip prarastume dalį duomenų. Tai ką daryti, kad tas praradimas būtų kuo mažesnis. Mes surasime tame 50 samplų intervale mažiausią bei didžiausią reikšmes ir piešiam jas jungiančią liniją. Tik nepamirškim, kad maksimali reikšmė gali sutapti su minimalia, ko pasekoje nieko nesimatys:) Taigi gauname tokį vaizdą:

Wav failo vaizdas

Dabar mums reikia padaryti traukiamos pelės efektą, kad įspaudę ir traukdammi pelę ant paveikslėlio matytume žymimas ribas. Žinodmai pelės koordiantes naudosime CopyFromScreen metodą su opcija CopyPixelOperation.PatInvert ir taip keisime žymimos vietos spalvą. Štai rezultatas:

Pelės žymėjimas

Na beliko papasakoti apie spekrtogramą. Pirmiausiai apie tai kas tai yra ir kam ji naudojama. Spektrograma yra 3D diagrama, kurioje horizontali ašis vaizduoja laiką, vertikali – dažnį, o kiekvieno taško spalva – intesyvumą. Iš prieš tai nupiešto wav failo grafiko mes neagalime pasakyt, kur kokia fonema, bet jeigu analizuosime tą grafiką iš dažninės pusės(spektrogramą), tai galim dešifruoti. Kad mūsų duomenis transformuoti į dažninį pavidalą turime atlikti Furje transformacija. Programavime naudojamas greitoji furje transformacija(FFT), kurios rezultatas išlieka toks pat, bet skaičiavimo operacijų skačius yra ženkliai sumažinamas. Kad paskaičiuoti FFT aš naudojaus jau parašytu kodu iš “Numerical Recipes” knygos, kurį galite rasti čia. Taip pat galima naudotis ir Exocortex.DSP biblioteka.Prieš skaičiuojant FFT mes turime apsispręst, kokio ilgio intervalams jį skaičiuoti. Ilgis turi būti skaičius ‘2′ pakeltas laipsniu. Tai yra 2^7, 2^8,2^9…

128, 256, 1024… Taip pat turim apsispręsti ar intervalai persidengia. Pavyzdžiui jeigu skaičiuojame 256 ilgio intervalams su 0% persidengimu, tai intervalai bus tokie [0..255] [256..511][512..767]. Jeigu skaičiuosim su 50% persidengimu imsim tokius intervalus [0..255][128..383][256..511]. Kuo didesneis intervalais imsime tuo bus geresnė rezoliucija dažnio atžvilgiu, bet prastesnė laiko. Kad pagerinti laiko atžvilgiu ir naudojamas persidengimas, bet tas reikalauja daugiau skaičiavimo operacijų ir laiko. Taigi dabar kiekvienam intervalui atliekam FFT. Taip gaunamas rezultatas yra matrica = [spektro stulpelių skaičius][intervalo ilgis]. Spektro stulpelių skaičius apskaičiuojamas padalinus samplų skaičių iš samplų skaičiaus apdorojamu viename intervale. Gavę šią matricą mums belieka apskaičiuoti magnitudę kiekvienam taškui(pakelt kvaratu) bei normalizuoti duomenis taip, kad jie būtu atvaizduoti intervale nuo [0..255], nes yra 256 spalvos paletėje. Taigi gaunamas rezultatas:

Spektrograma



One Response to “Wav failai ir spektrograma”  

  1. 1 dd

    ilgio intervalai manau turetu buti vadinami langais, mat cia siejasi su spektro analize, keičiant langų ilgį. siaip straipsnis visai neblogas


Leave a Reply