Hangkártyák programozása retro 20.

8. Konvolúció a Fourier térben

Miután megismerkedtünk a diszkrét Fourier transzformációval és az azt megvalósító FFT-vel, a mesterséges hangzás létrehozásának elvét tárgyaljuk. Ahogy előzőleg említettem, erre a konvolúciót fogjuk használni. Nézzük meg először az elvét, illetve algoritmusát alapján és a megvalósítást végző program kódját [6] alapján.

8.1. Folytonos függvények konvolúciója

A konvolúció fogalmát egy egyszerű elektromos hálózat példáján keresztül fogjuk levezetni. Legyen adott egy áramkör, amely ellenállásokból és kondenzátorokból áll. A kondenzátorok miatt a hálózat bementére adott jel késéssel és némileg torzult formában jut el a kimenetre. Vezessünk be egy egyezményes mérőjelet, amelyet a hálózat bementére juttatunk és mérjük kimenetét, vagyis a bemenetre adott válaszát. E mérőjel legyen egy elég keskeny Dt szélességű feszültség impulzus. Az impulzus integrálja legyen egységnyi. Következésképp 1/Dt magas lesz. A Dt szélességű mérőimpulzusra adott rDt(t) válasz független Dt tényleges értékétől. Ez annál inkább tapasztalható, minél kisebb a Dt idő a válasz-impulzus lefutásának teljes tartamához képest. Ebből következik, hogy a Dt időt a hálózat tulajdonságait figyelembe véve kell megválasztani, mindig úgy, hogy Dt igen kicsi legyen a hálózat tranziens időihez képest. (Lásd F.21.)

F.21. Elektromos hálózat impulzusválasza

Természetesen a mérőjelet függetlenné tehetjük az adott hálózattól, mégpedig a Dirac-d gerjesztés bevezetésével. Ez esetben Dt kicsi bármely hálózat tranziens időihez képest, tehát Dt->0, vagyis mérőjelünk végtelenül keskeny, de ugyanakkor egységnyi területű impulzus, tehát végtelen magas is egyben. A hálózatnak a Dirac-d bemenetre adott válasz-függvénye a hálózat súlyfüggvénye. Ha tehát Dt tart zérushoz, a Dt szélességű impulzusra adott válasz tart a súlyfüggvényhez:

(8.1)

Dirac-d tulajdonságai a követezőek:

  • Értéke minden t értéknél zérus, kivéve a t=0 pillanatot, amikor végtelen,
  • Integrálja egységnyi.

Látható, hogy válasz csak a gerjesztés követően jön létre, vagyis míg a bemeneti Dirac-d a t=0 pillanatban jelentkezik, addig a súlyfüggvény csak a t>=0 pillanatokban lehet zérustól eltérő.

Ahhoz, hogy megértsük a hálózat tetszőleges gerjesztésére adott válasz számolását, tekintsük a következő példát. A bemenő függvényünket bontsuk fel Dt szélességű szakaszokra és közelítsük a függvényt a szakasz elején felvett értékével. Eredményként a gerjesztő függvényt, mint impulzus sorozatot kapjuk meg. Egyetlen Dt szélességű impulzusra ismerjük a hálózat válaszát: rDt(t). Jelen esetben pedig több, különböző magasságú, különböző időpontban jelentkező bemenő impulzusunk van. (Lásd F.22.)

F.22. Tetszőleges gerjesztő függvény felbontása Dt szélességű impulzusokra

Az i-edik impulzus a t=0 időponthoz képest iDt-vel később jelentkezik és magassága nem 1/Dt, hanem g(iDt). Tehát a válasz több rDt(t) formájú függvény összege lesz, amelyek a gerjesztő impulzus időbeni eltolásának és változó magasságának megfelelően eltolva és konstanssal szorozva jelentkeznek:

(8.2)

Ne felejtsük el, hogy lineáris hálózatról van szó, így több gerjesztés együttes hatása egyenlő  az egyenkénti gerjesztések hatásának összegével.

Finomítsuk most végtelenül a gerjesztő függvény impulzusokra bontását, azaz Dt tartson zérushoz. Ekkor (8.2) summája alatt az rDt(t) válaszfüggvény az s(t) súlyfüggvényhez tart. Maga a summa egy integrál közelítő összege, ami Dt->0 határátmenettel a t=iDt szerinti integrálba megy át a következő módon:

(8.3)

A fenti képlet a hálózatelméletből ismeretes, lineáris rendszerekre vonatkozó Duhamel tétel alapján vezethető le. A képlet maga pedig az úgynevezett konvolúciós integrál.

Az integrálási határok abból adódnak, hogy az integrálásnak csak azon t tartományra kell kiterjednie, amelyen az integrandus nullától eltérő lehet. Mivel feltételezzük, hogy

s(t)=0 ha t<0,

g(t)=0 ha t<0                            (8.4)

a t<0 esetben g(t) biztosan zérus, a t>t esetben s(t-t) biztosan zérus.

A v(t) válaszfüggvény tehát a g(t) gerjesztési- és az s(t) súlyfüggvény konvolúciója szerint számolható:

v(t)=g(t) X s(t)                            (8.5)

A gyakorlatban a konvolúciós integrál értelmezése igen érdekes: a g(t) függvényre rárajzoljuk az s(t)-t, a negatív t értékek felé áttükrözve és az origóját t pontba eltolva. Majd a közös szakaszon szorzatukat integráljuk, vagyis nem teszünk mást, mint vesszük g(t) függvénynek az s(t) súlyfüggvénnyel súlyozott integrálját. A v(t) függvény t paraméterét változtatva az s(t) függvény kezdőpontja eltolódik, s az s(t) szinte végigcsúszik a g(t)-n, miközben mindig más szakaszon képződik a súlyozott átlag.

Meg kell említeni, hogy a konvolúciós szűrés átalában információveszteséggel jár. Ennek vizsgálatához ismét egy egyszerű elektromos hálózatot választunk. (Lásd F.23.)

F.23. Integráló tag és súlyfüggvénye

Az integráló tag súlyfüggvénye a következőképpen alakul:

s(t)=(1/t)e-t/t  ha t<=0

s(t)=0 ha t<0                            (8.6)

Az ezzel való konvolúció durván t nagyságú időtartományra való átlagolásnak felel meg. Ha t igen nagy a vizsgált jel tartamához képest, akkor ez a konvolúció közelítőleg a jel integrálját adja. Az átlagolás miatt a magasabb frekvencia összetevők egyre kisebb amplitúdóval jutnak át a rendszeren. Ha a szűrés hatását semlegesíteni szeretnénk, megpróbálhatjuk alkalmazni a konvolúció inverz műveletét, a dekonvolúciót, azonban számolnunk kell azzal, hogy a kimeneten véletlenszerű feszültségingadozás, vagyis zaj jelenik meg. Ha a jel magas frekvenciájú összetevői annyira legyengülnek, hogy a zajszint alá esnek, akkor a kiegyenlítő visszaerősítés már nem az eredeti komponenseket, hanem hozza vissza, hanem a zajt.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s