GPGPU Hangfeldolgozás és hangszintézis
Tartalom A mostani órán hangszintézis és hangfeldolgozási alapokat tekintünk át Ahhoz, hogy értelme legyen a problémák többségénél GPU-t használni, egy bizonyos (méret/számítási komplexitás) küszöböt át kell(ene) lépnie a feladatnak Mert egyébként az idő nagyját egy OpenCL/CUDA/GPU megoldás az adatok tologatásával tölti a RAM és a GPU memória között És valós idejű audioban tipikusan kicsi adathalmazokat dobálunk
Tartalom Egy cikk arról, hogy konkrét architektúrán, méréssel mi az a méret ami felett megéri a GPU-ra átvinni a számításokat: http://arxiv.org/ftp/arxiv/papers/1211/1211.2038.pdf Egy másik arról, hogy mit jó ott számolni: http://queue.acm.org/detail.cfm?id=2484010 Mindezekért a mai óra elsősorban a gyakorlati alapokról szól, nem pedig arról, hogy konkrét alkalmazásban hogyan kellene megoldani az adott problémát, hogy haszna is legyen
Hangfeldolgozás
Hangfeldolgozás A hangfeldolgozás célja hanganyagok módosítása, hangokból információ kinyerése
Hang A hang fizikailag egy rugalmas közeg mechanikai rezgése, illetve a rezgés hullámként való terjedése Tehát a hang csak közegben tud terjedni (ami lehet gáz, folyadék és szilárd test is), vákuumban nem A rezgés egy oszcilláló mozgás egy egyensúlyi állapot körül
Hang A hangforrás rezgéseket kelt az őt körülvevő közegben Ahogyan folytatódik a hangforrás rezgése, elkezd terjedni a közegben A forrásától egy rögzített távolságra a közeg nyomása, sebessége és eltolódása idővel változik A terjedés közben a hanghullámok visszaverődhetnek, törhetnek (közeghatárokon) és elnyelődhetnek a közegben
A hang leírása Hangnyomás: Hanghullámok által keltett, változó nyomás rugalmas közegben, amely a hangtérben közvetlenül mérhető. Jele a kis p, mértékegysége a Pa (pascal). A hallásküszöb nyomásértéke 2 khz-es frekvenciánál 20 µpa. Mérhetjük csúcsértékét, effektív értékét vagy akár számtani középértékét. A hangnyomás hozzáadódik a normális légköri nyomáshoz. Haladó síkhullámban a részecskék kitérése és a hangnyomás között 90 fáziseltolás van.
A hang leírása Hangrezgési sebesség: Az a váltakozó irányú és nagyságú sebesség, amellyel a hangot továbbító közeg részecskéi nyugalmi helyzetük körül rezegnek. Jele a kis v, mértékegysége a m/s (méter per szekundum). Hangnyomásszint: Két hangnyomás érték hányadosának a tízes alapú logaritmusa. Jele Lp, mértékegysége a db (decibel). Számításának módja: Lp=20*lg(p/p0).
A hang érzékelése
A hang érzékelése Ha a hang rezgésszáma 20Hz-20kHz közötti, akkor az emberi fül képes érzékelni (az előbbiek alatt az infra-, utóbbiek fölött pedig az ultrahangok vannak) Az emberi fül kb. 400000 különböző hangot tud megkülönböztetni A fülkagyló a levegő rezgésének felfogására formálta alakját A fülkagyló a bejövő rezgéseket a hallójáraton továbbítja a középfülbe
A hang érzékelése A középfülben a hanghullámok a dobhártyába ütköznek, amely vibrálni kezd A dobhártya rezgéseit a hallócsontok adják tovább a csigának A csigában található szőrsejtek alakítják át aztán a bejövő mechanikai energiát (rezgés) elektromos energiává Ezt az energiát pedig a hallóidegen keresztül az agyba juttatja
A hang érzékelése A csigában a különböző frekvenciákra különböző részek rezonálnak majd A hasonló frekvenciákra rezgésbe jövő érzéksejtek közel helyezkednek el, azaz az érzéksejtek tonotopikusan rendeződnek el De a különböző frekvenciákra nem ugyanakkora a reakció az emberi hallás nem lineáris
Ugyanolyan hangosnak érzékelt hang, frekvencia függvényében
A hang érzékelése Az öregedéssel (és túl nagy hangnyomásváltozásnak kitéve...) csökken a legmagasabb frekvencia amit hallunk (egészséges felnőttek 15-17kHz-nál magasabban nem hallanak már általában) Ez mindkettő esetben visszafordíthatatlan A 4-16Hz közötti hangokat tapintásként tudjuk érzékelni Zeneileg értelmezhető legalacsonyabb hang 12Hz nagyjából
Zenei hangok C0 = 16.352Hz http://en.wikipedia.org/wiki/musical_acoustics#pitch De csak óvatosan: a teteje messze nem 4400Hz a táblázatban nincsenek benne a felharmonikusok!
A hang érzékelése A különböző állatok más-más tartományokban hallanak (és ezen belül sem lineárisan!): http://www.lsu.edu/deafness/hearingrange.html Tanulság: ha el akarsz kapni egy egeret, akkor ne kelts magas frekvenciás zajt!
A hang érzékelése Lokalizáció: a két fülünk által hallott hangok különbségéből az agyunk tud következtetni a hangforrás térbeli eredetére (hozzánk képest) Elfedések (masking) Hiányzó alaphang: 2f, 3f, 4f, frekvenciák esetén az agy implicit az f-et érzékeli alaphangnak
Az érzékelt hang A hang emberi érzékelése szempontjából elsősorban a következő mentén gondolkozunk az érzékelt hangról: Hangosság (nem fizikailag mennyire hangos, hanem hogy milyen hangosnak érzékeljük!) Hangszín (timbre) Hangmagasság (milyen zenei hangnak halljuk) Időtartam
Analóg és digitális
A hang digitális reprezentációja A hangot egy egydimenziós vektor elemeiként tároljuk el A vektor elemeit úgy képezzük, hogy megmérjük a rezgés nagyságát rögzített időközönként (mintavételezési időközönként) Minden egyes mintája (sample) ennek a vektornak megmondja a rezgés amplitudóját az adott időpillanatban (pontosabban: https://ccrma.stanford.edu/~jos/mdft/footnode.html# )
Reprezentáció Shannon-Nyqist: ha egy x(t) függvény nem tartalmaz 2B Hz-nél magasabb frekvenciájú komponenseket, akkor az x(t) függvényt egyértelműen meghatározzák 1/(2B) másodpercenként mért értékei Legyen Fs > 2B a mintavételezési frekvencia, a T = 1/Fs pedig a mintavételezési időköz Ekkor a jelet a következőképpen kapjuk vissza:
Reprezentáció A sinc(x) = sin(x)/x a következőképpen néz ki:
Reprezentáció Tehát az x[n] = x(t*n) mintákból úgy kapjuk vissza az x(t) függvényt, hogy a mintákat összemossuk a megfelelő sinc() függvényeltolt adott pillanatban vett értékével:
Reprezentáció Azaz praktikusan: a számítógépben csak közelíteni tudjuk, mert a sinc() tartója végtelen Azaz végtelen sok mintát kellene összemosni (még ha nagyon kicsi együtthatókkal is), hogy tényleg visszakapjuk x(t) Van ahol elhagyhatóak a kicsi együtthatók, van ahol nem alkalmazásfüggő
Első program
Első program http://cg.elte.hu/~gpgpu/opengl/gyak02/01_helloau
Második program
Második program http://cg.elte.hu/~gpgpu/opengl/gyak02/02_hellosy
Hangelemzés
Hangok A probléma a sinc() és eltoltjainak bázisával, hogy impulzus-jellegű Nehezebb emberi intuíciót kialakítani arról, hogy mit is jelent, ha a k-adik minta egy adott értéket vesz fel Azért is, mert a fülünk lényegében a saját, külön rezgő részeinek rezonanciáját figyeli Azaz mintha azt nézni, hogy az érzékelt hang előállításában a különböző frekvenciájú rezgések mennyire erősek
Hangok A hangot felbonthatjuk egyszerűbb, de még inkább hang-szerűbb építőelemekre is Lényegében lecseréljük a sinc() bázist (a sinc() és eltoltjait) valami másra A diszkrét Fourier transzformációval (DFT) komplex szinuszoidok bázisában írhatjuk fel a hangot Itt a bázisfüggvények különböző frekvenciájú komplex szinuszoidok lesznek
Komplex szinuszoid Az Euler-azonosságból tudjuk, hogy Ekkor Ha a fentit egy komplex számmal szorozzuk, akkor nem csak a szinuszoid amplitudóját, hanem a fázisát is tudjuk módosítani:
Bázisok a sík pontjainak Y X
Bázisok a sík pontjainak Y X j i
Függvénybázisok ϕ sin(ω t+ϕ) ω t
Függvénybázisok ϕ sin(ωt+ϕ) ω t
Függvénybázisok ϕ sin(ω t+ϕ) ω t
Függvénybázisok ϕ ω sin(ω t+ϕ) t
Fourier transzformáció(k)
DFT
Szűrők
Szűrők
Szűrők
Szűrők
Egyszerű lowpass y[n] = a * (x[n] + x[n - 1]) + b * y[n - 1] f = 2pi * fc / fs b = cos(f) / (1 + sin(f)) a = (1 - b) / 2
Irodalom https://ccrma.stanford.edu/~jos/mdft/ https://ccrma.stanford.edu/~jos/filters/ http://www.amazon.com/fundamentals-musical-aco